在 JavaScript 中使用 wait 时通过 catch 处理 Promise 拒绝

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 机制可以提高代码的健壮性和可读性。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。