我有一个返回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
在这种情况下没有运行的原因。
答案 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;