我正在运行以下形式的事件循环:
var i;
var j = 10;
for (i = 0; i < j; i++) {
asynchronousProcess(callbackFunction() {
alert(i);
});
}
我正在尝试显示一系列显示数字0到10的警报。问题是,在触发回调函数时,循环已经经历了几次迭代,并且它显示了较高的i
值。对如何解决这个问题有什么建议吗?
发布于 2017-08-01 15:33:29
var i = 0;
var length = 10;
function for1() {
console.log(i);
for2();
}
function for2() {
if (i == length) {
return false;
}
setTimeout(function() {
i++;
for1();
}, 500);
}
for1();
这里是一个示例函数方法,说明这里所期望的内容。
发布于 2018-08-18 09:29:51
ES2017:您可以将异步代码包装在返回promise( promise内的异步代码)的函数(比如XHRPost)中。
然后在for循环中调用函数(XHRPost),但要使用神奇的Await关键字。:)
let http = new XMLHttpRequest();
let url = 'http://sumersin/forum.social.json';
function XHRpost(i) {
return new Promise(function(resolve) {
let params = 'id=nobot&%3Aoperation=social%3AcreateForumPost&subject=Demo' + i + '&message=Here%20is%20the%20Demo&_charset_=UTF-8';
http.open('POST', url, true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.onreadystatechange = function() {
console.log("Done " + i + "<<<<>>>>>" + http.readyState);
if(http.readyState == 4){
console.log('SUCCESS :',i);
resolve();
}
}
http.send(params);
});
}
(async () => {
for (let i = 1; i < 5; i++) {
await XHRpost(i);
}
})();
发布于 2012-07-15 07:11:03
JavaScript代码在单个线程上运行,因此在开始下一个循环迭代之前,您通常不能阻塞以等待第一个循环迭代完成,而不会严重影响页面的可用性。
解决方案取决于你真正需要的是什么。如果这个示例非常接近您的需求,那么@Simon建议将i
传递给您的异步进程是一个很好的建议。
https://stackoverflow.com/questions/11488014
复制相似问题