取消ES6承诺

是不是可以通过调用Promise.reject(reason)来取消ES6承诺?

像这样的东西:

 Promise.resolve().then(function () { return 'foo'; }).then(function () { return console.log('we were here'); }).then(function () { return Promise.reject({type: 'canceled'}) }).then(function () { return console.log('never visited'); }).catch(function (e) { console.log(e); }); 

通过Promise.reject “取消”承诺有什么不利吗?

不,你不能用Promise.reject()取消承诺。

Promise.reject()只是一个帮助函数,返回一个新的已经被拒绝的承诺。

例如,如果你已经有了承诺p ,那么就没有办法取消它了:

 var p = fetch("flower.png"); // No way to reject p or "cancel" the fetch. 

重要的是, p不是fetch的控制面。 你所能做的就是拒绝随后的链接承诺:

 p = p.then(result => cancel? Promise.reject(new Error("Cancelled")) : result); 

或者简单地忽略p ,这具有相同的效果。

这就是说,你的代码看起来很好,但不符合你的问题。 大多数人认为这是error handling,或拒绝传播,而不是取消,虽然它确实打破了后续asynchronous操作链,就像你展示的那样。