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

问题描述 投票:0回答:2

我试图理解异步等待与承诺和 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)
    }
})();
javascript async-await es6-promise
2个回答
3
投票

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


0
投票

如果你想在第一次出现偶数的时候不停地检查所有的数字,你需要清除拒绝

function* genPromise(arr) {
    for (const value of arr) {
        yield new Promise((resolve, reject) => {
            if (value % 2) {
                resolve(`The value ${value} is odd`);
            } else {
                resolve(`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)
    }
})();

© www.soinside.com 2019 - 2024. All rights reserved.