1. 简要介绍使用 wait 时 Promise 拒绝的处理
在 JavaScript 中,等待(wait)并发处理操作结束的一种方式是使用 Promise。当 Promise 表示的并发处理操作失败时,Promise 变为拒绝态(rejected)。为了捕获拒绝的 Promise,我们可以使用 catch 方法。
promise
.then((value) => {
// 处理成功
})
.catch((error) => {
// 处理拒绝
});
2. 如何使用 wait 以及 catch 结合
2.1 使用 async/await
async/await 是在 ES2017 中引入的一种处理异步操作的语法糖,它使得编写异步代码更加简单。我们可以使用 async/await 来等待并发处理操作的结束,并使用 try...catch 来处理 reject。
async function doSomething() {
try {
await wait(1000); // 等待 1s
const result = await asyncOperation(); // 并发处理操作
// 处理操作成功
} catch (error) {
// 处理操作失败
}
}
以上代码等待 1 秒后调用 asyncOperation 进行并发处理操作,处理操作成功后进入 try 中完成后续操作,若处理操作失败则进入 catch 中处理错误。
2.2 使用 Promise.all
Promise.all 可以并行地执行多个 Promise 对象,并在所有 Promise 对象执行成功后返回一个成功的 Promise 对象,否则返回一个拒绝态 Promise 对象。如果一个 Promise 对象失败,则 Promise.all 的拒绝态 Promise 对象会直接执行 catch。
Promise.all([p1, p2, p3])
.then(values => { /* values 数组包含了所有操作的结果 */ })
.catch(error => { /* 处理错误 */ })
以上代码中,Promise.all 等待 p1、p2 和 p3 三个并发处理操作全部结束。当三个操作都成功完成时,Promise.all 的 then 处理程序被调用并将包含所有操作的结果 values 传递给它。但如果任何一个操作失败,则 Promise.all 的 catch 处理程序被调用并处理该操作的错误。
2.3 通过封装 Promise 实现自定义的 wait 函数
我们可以通过封装 Promise 实现自定义的 wait 函数。该函数使用 Promise 对象来等待一段时间,然后 resolve。如果指定了 reject 值,则拒绝 Promise。
function wait(timeout, rejectValue) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (rejectValue) {
reject(rejectValue);
} else {
resolve();
}
}, timeout);
});
}
以上代码中,wait 函数返回一个 Promise 对象。setTimout 函数用于等待一段时间来模拟异步操作。如果在 timeout 毫秒后指定了 rejectValue,则 Promise 被拒绝。否则,Promise 成功并完成。
3. 示例
下面是一个使用 wait 和 catch 处理拒绝 Promise 的示例。这个示例会并发发出 HTTP 请求(get 方法),并等待它们都完成。如果有任何一个 HTTP 请求失败,则进入 catch 处理程序,并打印错误信息。否则,进入 then 处理程序并打印所有响应。
async function fetchAll(urls) {
try {
const responses = await Promise.all(
urls.map(async (url) => {
const response = await fetch(url);
if (!response.ok) { // 如果请求失败
throw new Error(`Failed to fetch ${url}`);
}
return response.text();
})
);
console.log('All responses:', responses);
} catch (error) {
console.error(error);
}
}
fetchAll([
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/not_found',
]);
在以上示例中,fetchAll 函数等待三个 HTTP 请求全部完成,并使用 await 和 Promise.all 等待并发发出HTTP请求,如果任何一个请求失败,则进入 catch 处理程序并打印错误信息,否则,进入 then 处理程序并打印所有响应。
4. 总结
使用 Promise 的拒绝态和 catch 机制可以有效地处理异步操作中的错误。我们可以使用 async/await、Promise.all 和封装 Promise 等方法来实现在 JavaScript 中等待及并发处理操作的方式,同时也能够处理拒绝的 Promise。在实际开发中,合理使用 Promise 和 catch 机制可以提高代码的健壮性和可读性。