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:循环中如何等待方法完成了再继续?的主要内容,如果未能解决你的问题,请参考以下文章