javascript - 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)
}
})();
解决方案
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)
}
})();
推荐阅读
- doxygen - QGArray::at: 绝对索引 7645637866 超出范围
- javascript - 在按钮单击时将数据获取到模态,按钮具有相同的 ID
- c++ - 找不到 n*n 矩阵的行列式
- python - 如何使用 python 代码在 jupyter notebook 中保存 ipython 小部件的状态
- python - 使用 pip 和 easy_install 在 Windows 上安装 pycurl 问题
- c++ - 如何在 MacOS 上检测 C++ 中的按键?
- javascript - Ajax Autocomplete 用相同的值填充两个输入字段,尽管我已经用不同的逻辑分别实现了这两个函数
- swift - Xcode 11.2.1 - Swift 5 - 无法将主故事板“Main”更改为另一个故事板“Start”
- r - 在 Github 中删除自定义域
- java - 如果找不到文件,如何显示错误消息?