承诺解决未定义的值

分享于2022年07月17日 es6-promise javascript web 问答
【问题标题】:承诺解决未定义的值(Promise getting resolved for undefined values)
【发布时间】:2022-01-27 02:17:33
【问题描述】:

我正在学习 Javascript 中的 Promise,当我对未定义的值使用 Promise.all 方法时,“then”块正在执行。任何人都可以在这方面帮助我打印未定义值的 catch 块吗?

let promise1, promise2, promise3, totalPromises;

totalPromises = () => {
    return Promise.all([promise1, promise2, promise3])
        .then(() => console.log("All promises are resolved"))
        .catch(() => console.log("All promises are not resolved"))
}

totalPromises();

输出: 所有的承诺都解决了

  • 这是因为 catch 块是由 promise 拒绝触发的,而不是未定义的值

【解决方案1】:

当传递给 Promise.all 的数组具有不是Promise 对象(或thenables)的值时,它们将被包装到promise 中,就像您使用 Promise.resolve(value) 得到的一样。如果您不希望特定值的这种行为,那么您必须编写代码来嵌入您想要的行为。

例如,下面的 toPromise 函数将在其参数为 undefined 时返回一个 rejected promise 对象,并将使用 Promise.resolve 将任何其他非promise 值包装到一个Promise 对象中。

您可以在将数组传递给 Promise.all 之前通过该函数映射数组:

function toPromise(arg) {
    return arg === undefined      ? Promise.reject("value is undefined") 
         : arg instanceof Promise ? arg
                                  : Promise.resolve(arg) ;
}

let promise1, promise2, promise3, totalPromises;

totalPromises = () => {
    return Promise.all([promise1, promise2, promise3].map(toPromise))
        .then(() => console.log("All promises are resolved"))
        .catch(() => console.log("Not all promises are resolved"))
}

totalPromises();

现在,也许您想在值为 null 或其他不想要的值时扩展此行为。