首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >javascript for循环中的异步进程

javascript for循环中的异步进程
EN

Stack Overflow用户
提问于 2012-07-15 06:56:56
回答 3查看 161K关注 0票数 164

我正在运行以下形式的事件循环:

var i;
var j = 10;
for (i = 0; i < j; i++) {

    asynchronousProcess(callbackFunction() {
        alert(i);
    });
}

我正在尝试显示一系列显示数字0到10的警报。问题是,在触发回调函数时,循环已经经历了几次迭代,并且它显示了较高的i值。对如何解决这个问题有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 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();

这里是一个示例函数方法,说明这里所期望的内容。

票数 4
EN

Stack Overflow用户

发布于 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);
       }
})();

票数 4
EN

Stack Overflow用户

发布于 2012-07-15 07:11:03

JavaScript代码在单个线程上运行,因此在开始下一个循环迭代之前,您通常不能阻塞以等待第一个循环迭代完成,而不会严重影响页面的可用性。

解决方案取决于你真正需要的是什么。如果这个示例非常接近您的需求,那么@Simon建议将i传递给您的异步进程是一个很好的建议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11488014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档