首页 > 解决方案 > ERR_UNHANDLED_REJECTION UnhandledPromiseRejection 在 promise 对象数组中等待时

问题描述

我试图用承诺和 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)
    }
})();

标签: javascriptasync-awaites6-promise

解决方案


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)
    }
})();


推荐阅读