【发布时间】:2017-07-29 11:17:27
【问题描述】:
while (repoUrlLink != null && count < 90) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', repoUrlLink, false);
xmlHttp.setRequestHeader('Authorization', 'Bearer ' + userData.accessToken);
xmlHttp.onload = function () {
if (xmlHttp.status != 200) {
displayNoAccessMessage();
break;
}
var result = JSON.parse(xmlHttp.responseText);
if (result.length == 0) {
displayNoRecordsMessage();
break;
}
var header = xmlHttp.getResponseHeader('link');
if (header) {
//doing something
}
else
repoUrlLink = null;
$.each(result, function (index, eachData) {
// doing something with data
count++;
});
}
xmlHttp.send();
}
一旦我显示错误,有没有更好的方法可以退出循环。break 语句不起作用。有什么回调有用吗?
【问题讨论】:
-
不可能。在循环完成之前,回调永远不会运行。你不能使用循环,使用递归方法。
-
@Bergi 您能否提供修改后的示例?也只是想确认这种方法是否好,或者有没有更好的方法来做同样的事情?
-
将
while循环的同步break语句放在异步回调函数代码中不起作用。控制台上的 JavaScript 编译器错误消息抱怨它。有关如何处理异步结果的深入讨论,请参阅 stackoverflow.com/q/14220321/5217142。我建议创建一个函数,该函数返回一个请求操作的 Promise,该操作在错误时被拒绝,并用于实现异步递归以进行重试。 -
这有助于将获取数据、识别和响应错误以及处理数据的操作分开。目前它们都混在一起导致代码失败。
-
@Traktor53 能否请您提供代码的架构/布局?那真的很有帮助。
标签: javascript asynchronous callback xmlhttprequest