我有一个承诺实现,就像MDN上的承诺:
var p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "one");
});
var p2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, "two");
});
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, "three");
});
var p4 = new Promise((resolve, reject) => {
setTimeout(resolve, 4000, "four");
});
var p5 = new Promise((resolve, reject) => {
reject("reject");
});
Promise.all([p1, p2, p3, p4, p5]).then(value => {
console.log(value);
}, function(reason) {
console.log(reason)
});

这样可以快速捕捉错误:
如果其中一个元素被拒绝且Promise.all
快速失败,则
Promise.all
被拒绝:如果您有四个承诺在timeout
之后解决,并且一个立即调用reject
,然后Promise.all
立即拒绝。
然而,promise
内的功能不会停止运行。我想要的是,如果一个函数执行reject
,其他函数将停止运行(防止向用户发送无用的消息)。
拒绝后继续运行的承诺示例:
var p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "one");
});
var p2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, "two");
});
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, "three");
});
var p4 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Don\'t show this after a reject!');
resolve();
}, 4000);
});
var p5 = new Promise((resolve, reject) => {
reject("reject");
});
Promise.all([p1, p2, p3, p4, p5]).then(value => {
console.log(value);
}, function(reason) {
console.log(reason)
});

答案 0 :(得分:4)
承诺中没有任何通用可以做到这一点,因为停止其他操作是特定于操作的,而不是通用的。例如,在您的示例中,您必须保留计时器句柄,然后使用clearTimeout
;使用ajax请求,您可能需要进行abort
调用;与其他东西,它将是别的东西。
因此,您需要在实际代码中以特定于您的实际代码的方式处理此问题,使用.catch
对Promise.all
返回的承诺(或第二个arg {{1}如你所愿)。
在你问题的具体代码中,它看起来像这样(我已经将输出添加到我们也没有取消的定时器),但是它会根据你取消的内容而变化:
then