如何等到承诺完成后再继续循环

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

【讨论】:

以上是关于如何等到承诺完成后再继续循环的主要内容,如果未能解决你的问题,请参考以下文章

Angular forEach 等到所有承诺都完成?

NodeJS - 等到流式传输多个文件完成后再继续编写代码

等待内部带有承诺的 forEach 完成

Mp3 播放类播放列表中的歌曲,但要等到一首完成后再继续

如何等到文件完成写入后再使用它?

nodejs 等到循环中的所有 MongoDB 调用完成