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
,这个错误将被捕获,并在控制*打印出错误信息。