javascript:循环中如何等待方法完成了再继续?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript:循环中如何等待方法完成了再继续?相关的知识,希望对你有一定的参考价值。

for(i++)

a(i);

function a(num)

要做很多事情,如ajax获取信息等。

问:
1、如何实现等待方法a完成了工作才继续?
2、换成函数是否会有改善?

注:不想用判断xmlHttp.readyState等方法来实现。
初学者,麻烦请示例。我自己弄好像弄不了

a里面执行了几次的ajax连接啊,这是需要时间的。必须等到a方法中的所有方法都完成了,才进行下一个循环。现在出现的结果是,i一下子直接到最大值了,根本没有等到a去执行。

就是不想用xmlHttp.readyState啊,js不提供其它途径吗?等到a执行完成了,i再加一。
我的for没问题。如果我在a之后加个alert中断,a就有足够的时间去完成工作,整个程序有效。当然不可能加延时的,因为完成的工作时间不可估计。

---------------------------------------------------------------------------------
这样问可能清晰一点吧:
var content;//页面内容
a();//a用ajax取得页面内容,赋给全局变量content
b();//对content进行处理
但是,a都还没执行完,都还没拿到内容给content,b就开始处理了
怎么办?
限制:不把b()放到a()中。
---------------------------------------------------------------------------------

如果要实现你的这种效果,应该把思路改变一下

function a(num)

//这里面有用到Ajax的技术,当然一般会有个回调函数
//假定这个回调函数为callback()


function callback()

//把for循环的判断移到这里来
//打个比方,当i=0时,已经调用了a(num)
//if (xmlHttp.status == 200)
//这里处理的当i=0时的事件
//再次调用a(num)
//


也就是说没有for循环了,当你想再次调用这个a函数时,实际上是在回调函数里完成的,即当上次的Ajax请求成功返回并处理后会再次发出Ajax请求
参考技术A ajax中有个 if (xmlHttp.readyState == 4)
if (xmlHttp.status == 200)
这个就是已经就绪的标志!4和200都是标志。

xmlhttp的状态:1 装备阶段、2 发送、3 接收、4 所有数据接收完成。

服务器返回的状态:200 正常返回。 404 网页不存在 等。
xmlHttp.onreadystatechange =(function)
这个是触发之后要调用的函数
参考技术B xmlHttpRequest.open("POST", url, false); // 同步请求,true为异步
不就会等待你的ajax请求返回了吗?本回答被提问者采纳
参考技术C 一般用方法的回调来解决此类问题,
难道你现在的程序a方法没完成他就开始循环了?
程序是按顺序执行的啊,你描述的有问题!
晕,那就是你的for循环写的有问题!
参考技术D 用匿名函数可以实现

Javascript等待Promise在返回响应之前完成for循环

我想在for循环中的Promise完成之后做出响应。

我看过these questions,但他们没有解决我的情况。

methodGetOrders和methodGetLines是我必须使用的外部库的一部分。它们都进行网络呼叫,因此存在一些预期的延迟。该函数始终返回“0”,因为它不等待内部承诺完成。我意识到没有办法“等待”承诺完成,但如何在响应中获得正确的计数器值?

doWorkMainFunction() {
  methodGetOrders()
    .then(orderList =>  {
       var counter=0;
       for (var i=0; i< orderList.length; i++) {
         methodGetLines()
           .then (lineData => {
              if (someCondition) { counter++; }
            } // end of inner THEN
       } // end FOR loop
       return counter; // This always returns '0'
   } // end of outer THEN
}
答案

在循环中创建所有承诺的数组,然后在所有承诺解决后使用Promise.all()返回计数器

methodGetOrders()
  .then(orderList => {
    var counter = 0;

    var promises = orderList.map(order => {
      return methodGetLines()
        .then(lineData => {
          if (someCondition) {
            counter++;
          }
        }) // end of inner THEN
    }) // end promise map
    return Promise.all(promises).then(_ => counter);
  }) // end of outer THEN
})

以上是关于javascript:循环中如何等待方法完成了再继续?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript for 循环不等待 .then 完成

异步IO(协程,消息循环队列)

Javascript,如何等待多个承诺[重复]

如何等待函数在javascript中完成?

如何让子进程等待信号?

运行方法并等待完成所有 for 循环 openmp