Promise 对象与异步任务串联
在 JavaScript 中,Promise 对象被用来管理异步任务。每个 Promise 对象代表一个尚未完成的但预期将来会完成的操作。通过then*,我们可以将多个 Promise 对象串联起来,依次执行异步任务。图解思路的核心代码实现假设我们有一系列需要按顺序执行的异步任务,每个任务都返回一个 Promise 对象。我们可以通过以下方式串联这些任务:function asyncTask1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
c*ole.log('Task 1 completed');
resolve('Result from Task 1');
}, 1000);
});
}
function asyncTask2(resultFromTask1) {
return new Promise((resolve, reject) => {
setTimeout(() => {
c*ole.log('Task 2 completed with input:', resultFromTask1);
resolve('Result from Task 2');
}, 1000);
});
}
function asyncTask3(resultFromTask2) {
return new Promise((resolve, reject) => {
setTimeout(() => {
c*ole.log('Task 3 completed with input:', resultFromTask2);
resolve('Result from Task 3');
}, 1000);
});
}
// 使用 then *串联任务
asyncTask1()
.then(result1 => asyncTask2(result1))
.then(result2 => asyncTask3(result2))
.then(result3 => {
c*ole.log('Final result:', result3);
})
.ca*h(error => {
c*ole.error('An error occurred:', error);
});
使用 async 和 await 解决回调地狱async和await关键字提供了一种更简洁的方式来处理 Promise,避免了回调地狱的问题。在async函数内部,我们可以使用await关键字等待 Promise 的结果,而不必使用then*。async function executeTasks() {
try {
c*t result1 = await asyncTask1();
c*t result2 = await asyncTask2(result1);
c*t result3 = await asyncTask3(result2);
c*ole.log('Final result:', result3);
} ca*h (error) {
c*ole.error('An error occurred:', error);
}
}
executeTasks();
使用 try 和 ca*h 捕获错误在async函数中,try语句块用于标记要尝试执行的代码,而ca*h语句块则用于处理在try块中抛出的任何异常。如果try块中的代码抛出了一个错误(例如,由于一个 Promise 被拒绝),程序将立即跳转到ca*h块,并执行其中的代码。尝试捕获错误为了演示try和ca*h的捕获错误信息能力,我们可以故意将其中一个异步任务中的 URL 地址写错(虽然在这个例子中我们没有直接使用 URL,但可以模拟一个错误)。例如,我们可以在asyncTask2中抛出一个错误:function asyncTask2(resultFromTask1) {
return new Promise((resolve, reject) => {
// 模拟错误
reject(new Error('Something went wrong in Task 2'));
// setTimeout 和其他逻辑被注释掉以演示错误处理
// setTimeout(() => {
// c*ole.log('Task 2 completed with input:', resultFromTask1);
// resolve('Result from Task 2');
// }, 1000);
});
}
// 调用 async 函数执行任务
executeTasks();
当运行上述代码时,asyncTask2会立即拒绝其 Promise,并抛出一个错误。由于我们在executeTasks函数中使用了try和ca*h,这个错误将被捕获,并在控制*打印出错误信息。