通过Promise控制while循环然后函数

时间:2017-05-16 01:55:19

标签: javascript promise

我有一个返回Promise的函数

let processWork = function () {
  return new Promise(resolve => {
    console.log('- internal: start')
    // just wait 200ms for example
    let future = new Date(new Date().getTime() + 200)
    while (future > new Date()) {}
    console.log('- internal: done')
    resolve()
  })
}

我调用它并使用then函数来更改变量以打破无尽但无法工作

let doing = false
let done = false
while (!done) {
  if (doing) {
    continue
  }

  console.log('Starting work')
  doing = true
  processWork()
    .then(() => {
      console.log('Finished')
      done = true
    })
}

我得到输出

Starting work
- internal: start
- internal: done

我的代码仍然在永远运行。 我的问题是then function在这种情况下没有运行的原因。

1 个答案:

答案 0 :(得分:3)

在执行繁忙的循环时,承诺会以某种方式得到解决,这是不正确的。只要循环执行,就不会执行其他JavaScript(不包括Web worker)。以下循环将始终在每次迭代中执行continue语句,并且永远不会完成。

let doing = false
let done = false
while (!done) {
  if (doing) {
    continue
  }
  // ...
}

没有承诺可以帮助中断此循环,但在您的情况下,甚至没有承诺,因为 processWork 永远不会被执行。

如果 processWork 将被执行,则promise构造函数回调中的循环将锁定浏览器,直到目标时间到达:在该延迟期间没有其他JavaScript被执行。这违背了承诺的目的:它们是来锁定浏览器并允许执行其他代码,而承诺仍未决定。

所以,这样做:



let processWork = function () {
    return new Promise(resolve => {
        console.log('- internal: start delay of 200ms')
        // just wait 200ms for example, but don't stop execution of other code
        setTimeout(resolve, 200);
    })
}

console.log('Starting work')
processWork().then(() => {
    console.log('Promise resolved. Finished');
});
console.log('Waiting for promise to resolve...');
console.log('In the meanwhile let\'s calculate 10!');
let fact = 1;
for (let i = 1; i <= 10; i++) {
    fact *= i;
}
console.log('10! = ', fact);
&#13;
&#13;
&#13;