取消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操作链,就像你展示的那样。