承诺解决未定义的值

Promise getting resolved for undefined values

我正在学习 Javascript 中的承诺,当我对未定义的值使用 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();

输出: 所有承诺都已解决

这是 Promise.all 的正常行为,并且已在 Promise.all Fulfillment

的文档中定义

If a nonempty iterable is passed, and all of the promises fulfill, or are not promises, then the promise returned by this method is fulfilled asynchronously.

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

例如,下面的 toPromise 函数将 return 一个 rejected promise 对象,当它的参数是 undefined 并且将包装任何其他使用 Promise.resolve.

将非承诺值转换为 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 或其他不需要的值时扩展此行为。