// 模拟异步处理单个元素的函数
function processElement(element) {
return new Promise((resolve, reject) => {
// 模拟异步操作,比如随机成功或失败
const success = Math.random() > 0.5;
setTimeout(() => {
if (success) {
resolve(element * 2);
} else {
reject(`Element ${element} failed`);
}
}, 100);
});
}
async function asyncFunction1(arr) {
const successResults = [];
const failureMessages = [];
const promises = arr.map(async (element) => {
try {
const result = await processElement(element);
successResults.push(result);
} catch (error) {
failureMessages.push(error.message);
}
});
await Promise.all(promises);
return { successResults, failureMessages };
}
async function asyncFunction2(successResults) {
const promises = successResults.map(async (result) => {
const newResult = await processElement(result);
return newResult;
});
try {
return await Promise.all(promises);
} catch (error) {
throw new Error(`Operation failed: ${error.message}`);
}
}
// 调用逻辑
async function main() {
const initialArray = [1, 2, 3, 4];
const { successResults, failureMessages } = await asyncFunction1(initialArray);
console.log('asyncFunction1 success results:', successResults);
console.log('asyncFunction1 failure messages:', failureMessages);
try {
const finalResults = await asyncFunction2(successResults);
console.log('asyncFunction2 final results:', finalResults);
} catch (error) {
console.error('asyncFunction2 error:', error.message);
}
}
main();
异常处理策略和函数方法原理
-
asyncFunction1
中的异常处理:
- 对数组中的每个元素使用
map
方法创建一个异步操作的 Promise
数组。
- 在
try...catch
块中处理每个元素的异步操作,成功则将结果加入 successResults
数组,失败则将错误信息加入 failureMessages
数组。
- 使用
Promise.all
等待所有异步操作完成,这样即使有部分操作失败,也能继续处理其他元素。
-
asyncFunction2
中的异常处理:
- 同样对
asyncFunction1
的成功结果数组使用 map
创建异步操作的 Promise
数组。
- 使用
Promise.all
等待所有异步操作完成,如果其中有任何一个操作失败,Promise.all
会立即拒绝,并抛出错误,通过 try...catch
捕获并重新抛出带有更详细信息的错误,终止整个操作。
-
processElement
函数:
- 模拟一个异步操作,随机成功或失败,使用
setTimeout
模拟异步延迟。
- 通过
Promise
的 resolve
和 reject
方法分别表示操作成功和失败。