【发布时间】:2018-07-23 14:00:38
【问题描述】:
虽然所有关于Promise.all 的问题都集中在如何等待所有承诺,但我想换一种方式——当任何一个承诺失败时,停止其他承诺,甚至停止整个脚本。
这里有一个简短的例子来说明:
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'resolve1');
}).then(a => { console.log('then1'); return a; });
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 2000, 'reject2');
}).then(a => { console.log('then2'); return a; });
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'resolve3');
}).then(a => { console.log('then3'); return a; });
Promise.all([promise1, promise2, promise3])
.then(values => { console.log('then', values); })
.catch(err => { console.log('catch', err); throw err; });
// results:
// > "then1"
// > "catch" "reject2"
// > "then3" <------- WHY?
脚本继续解析promise3,即使最终的all(...).catch() 抛出!有人可以解释为什么吗?当其他承诺被拒绝时,我能做些什么来阻止其他承诺?
【问题讨论】:
-
Promise 没有魔法取消。如果你想要这种行为,你必须将
setTimeout的返回值保存在某处并调用clearTimeout。 -
但这只是一个例子,在实际用例中,我的承诺不会仅在超时时执行。除了 Node 的
process.exit()之外,没有通用的方法来阻止 Promise 吗? -
不能以你想要的方式取消承诺。这是一个众所周知的限制。像 rxjs 这样的可观察库提供了解决这个问题的替代方案。
-
为什么在
Promise中使用setTimeout?您可能会发现此演示文稿很有用:youtu.be/cCOL7MC4Pl0 -
@quezak:这个想法和
clearTimeout一样。首先,您需要一种停止任务的方法。在这一点上,Promise 并没有真正涉及。
标签: javascript promise es6-promise