ERR_UNHANDLED_REJECTION 在 promise 对象数组中等待时出现 UnhandledPromiseRejection

ERR_UNHANDLED_REJECTION UnhandledPromiseRejection when awaited inside an array of promise Objects

我正在尝试理解带有 promises 和 for..of 循环的异步等待。我有一个函数,它通过解析传递给它的偶数和拒绝传递给它的奇数来生成承诺。在一个异步函数中,我试图等待但得到 UnhandledPromiseRejection,即使我正在捕获错误。 我的问题是我遗漏了什么要点。为什么我收到 UnhandledPromiseRejection 以及如何处理它。我需要概念性信息

function genPromise(value) {
    return new Promise((resolve, reject) => {
        if (value % 2) {
            resolve(`The value ${value} is odd`);
        } else {
            reject(`The value ${value} is even`);
        }
    })
}

(async function () {

    x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    let y = x.map(d => genPromise(d))
    try {
        for await (let k of y) {
            console.log(k);
        }
    } catch (err) {
        console.log(err)
    }
})();

for await( 仅适用于异步迭代。您没有异步可迭代 - 只有普通可迭代,在这种情况下它等同于 for..of:

for (const k of y) {
  console.log(k);
}

k 承诺未被捕获,因此被拒绝。

在循环内等待 k,没有 for await:

function genPromise(value) {
    return new Promise((resolve, reject) => {
        if (value % 2) {
            resolve(`The value ${value} is odd`);
        } else {
            reject(`The value ${value} is even`);
        }
    })
}

(async function () {

    x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    let y = x.map(d => genPromise(d))
    try {
        for (const k of y) {
            console.log(await k);
        }
    } catch (err) {
        console.log('error', err)
    }
})();

如果你想从数字数组中创建一个异步可迭代对象,那么你可以这样做:

function* genPromise(arr) {
    for (const value of arr) {
        yield new Promise((resolve, reject) => {
            if (value % 2) {
                resolve(`The value ${value} is odd`);
            } else {
                reject(`The value ${value} is even`);
            }
        });
    }
}

(async function () {
    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    try {
        for await (const k of genPromise(arr)) {
            console.log(k);
        }
    } catch (err) {
        console.log('error', err)
    }
})();