【发布时间】:2020-01-05 08:44:22
【问题描述】:
编辑:我知道如何使用 async/await 让它工作,但不幸的是,我不能使用它,因为它没有得到广泛支持(尤其是 iOS 10、Internet Explorer 等)。所以我需要一个只有承诺的方式。
我对 Promises 很陌生,所以我被卡住了。我有这个 for 循环,只要 i 等于 2(例如),我就想打破它。我已经尝试放置reject,但它仍然持续到i<10。我希望它在满足我的条件时停止。
for (let i = 0, p = Promise.resolve(); i < 10; i++) {
p = p.then(_ => new Promise((resolve, reject) => {
setTimeout(function() {
console.log(i);
if (i == 2) {
reject("BREAK HERE");
} else {
resolve();
}
}, Math.random() * 1000)
})).catch(err => {
console.log(err);
});
}
当前输出:
0
1
2
BREAK HERE
3
4
5
6
7
8
9
我希望它只是:
0
1
2
BREAK HERE
【问题讨论】:
-
.catch()正在阻止它实际失败。 -
您的
catch不会传播错误 -
@TKoL 然后它在控制台中打印一个丑陋的错误: (node:66142) UnhandledPromiseRejectionWarning: undefined (node:66142) UnhandledPromiseRejectionWarning: UnhandledPromiseRejectionWarning: Unhandled Promise RejectionWarning。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝 ID:1)(节点:66142)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
-
你能解释一下你想用这段代码实现什么吗?你在这里的目标是什么? (我的意思不是“打破这个承诺循环”的意思,而是更抽象的意思。)就目前而言,您的代码看起来非常复杂。
-
我特别是。想知道你的
p = Promise.resolve()部分。为什么定义一个总是成功的承诺只是为了在 for 循环中附加一个成功处理程序?然后你创造了另一个承诺。为什么?
标签: javascript node.js ecmascript-6 promise es6-promise