如何等到承诺完成后再继续循环
Posted
技术标签:
【中文标题】如何等到承诺完成后再继续循环【英文标题】:How to wait until promise finishes before continuing the loop 【发布时间】:2017-09-07 01:53:49 【问题描述】:我想等到一个承诺完成后再继续我的 for 循环。请参阅下面的类似代码。照原样,循环将运行多次并运行所有承诺,但这对我的应用程序来说并不理想。我需要程序运行while循环,运行promise,等待解决,检查是否已经过了10秒或者设置了用户变量,如果没有,再次运行。
var p = promiseReturnedFromAFunction();
var time = new Date().getTime();
var user = 'undefined';
while(user === 'undefined' && Math.abs(time - new Date().getTime()) < 10000)
p.then(() =>
if(somecondition)
user='user';
break;
)
//Code should wait here until the above promise is done before continuing
如果有人能帮我解决这个问题,将不胜感激。
【问题讨论】:
你能把你的代码放在回调里面吗? 您能详细说明一下吗?我应该把什么代码放在哪里? p.then(() => if(somecondition) /*把你的代码放在这里*/ ) //不在这里 一个承诺只会解决一次。期望它的解析值由于调用 .then 而改变,而在两者之间没有任何其他操作会改变p
是没有意义的。
var p = promiseReturnedFromAFunction() 每次调用可能会导致不同的值
【参考方案1】:
var p = promiseReturnedFromAFunction();
var time = new Date().getTime();
var user = 'undefined';
p.then(() =>
while(user === 'undefined' && Math.abs(time - new Date().getTime()) < 10000)
if(somecondition)
user='user';
break;
);
我认为你把它倒过来了。您想等待承诺解决,然后循环检查您的条件以确保用户已设置或时间已过。
【讨论】:
如果不满足用户和时间条件,我将如何从该函数内部再次调用 p? 为什么需要再次运行 p?你只需要运行你的循环并检查此时的其他条件。 promise 中的值会随着时间而改变。这就是为什么我需要再次检查 @AllAnimals 嗯......不,他们不能......一旦承诺被解决,它就被解决了。【参考方案2】:我不清楚您想要实现的期望行为是什么。是否尝试确定一个值,如果不能,则每 X 秒重试一次?每 X 秒刷新一次值?
我能给出的唯一直接建议是,一旦你不得不等待一个承诺,你通常需要/想要继续将它与其他承诺和解决方案联系起来。您不想尝试“阻止”打破它的承诺。所以你要么想解析p
,然后在解析内部循环,要么你应该稍微颠倒逻辑并编写一个循环来检查somecondition
,并且只有在它为真时才解析p
。
【讨论】:
以上是关于如何等到承诺完成后再继续循环的主要内容,如果未能解决你的问题,请参考以下文章