解决方法是将循环中的函数提取到循环外部,并将返回值或抛出异常的逻辑放到Promise的.then方法中。
以下是一个示例代码:
function asyncFunction(i) {
return new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
if (i > 5) {
resolve(i * 2); // 返回一个值
} else {
reject(new Error("数字太小")); // 抛出异常
}
}, 1000);
});
}
function loop() {
let promises = [];
for (let i = 1; i <= 10; i++) {
// 循环中的函数提取到循环外部
promises.push(asyncFunction(i));
}
// 使用Promise.all来处理所有的Promise对象
Promise.all(promises)
.then((results) => {
console.log(results); // 打印所有返回的值
})
.catch((error) => {
console.error(error); // 打印错误信息
});
}
loop();
在上述代码中,我们将循环中的函数asyncFunction
提取到循环外部,并在循环内部创建了一个Promise对象,并将其推入一个数组中。然后,我们使用Promise.all
方法来处理所有的Promise对象,该方法会返回一个新的Promise对象,当所有的Promise对象都成功解析时,它会将所有的返回值作为一个数组传递给.then
方法;当任何一个Promise对象发生错误时,它会将错误信息传递给.catch
方法。这样,我们就可以在循环外部处理所有的返回值或错误信息,而不需要在循环中创建函数或处理异常。