【问题标题】: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() 每次调用可能会导致不同的值

标签: javascript while-loop promise


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2018-04-25
    • 2021-12-27
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2019-11-20
    • 2018-10-02
    相关资源
    最近更新 更多