封装 Promise 方法并用于公共函数库
前言
Promise 是 JavaScript 中非常重要的一种异步编程方法,可以很好地解决回调函数嵌套过深的问题,并支持更为灵活的错误处理方式。
在前端开发中,经常需要使用 Promise 来处理异步操作,比如发送 Ajax 请求、读取文件、获取位置信息等等。
在使用 Promise 时,通常会遇到一些通用的问题,比如如何处理多个 Promise 的并行执行,如何处理 Promise 的错误,如何取消 Promise 等等。为了解决这些问题,我们可以将这些通用的 Promise 方法封装成公共函数库,方便在项目中复用。
本文将介绍如何封装 Promise 方法,以及如何在公共函数库中使用 Promise。
Promise 封装
Promise.all
Promise.all 可以将多个 Promise 实例包装成一个新的 Promise 实例,该新 Promise 实例的状态由所有 Promise 实例的状态决定。
比如,我们有三个 Promise 实例 p1、p2、p3,可以使用 Promise.all 将它们包装成一个新的 Promise 实例:
Promise.all([p1, p2, p3]) .then(values => { console.log(values); }) .catch(error => { console.error(error); });
其中,values 是一个数组,包含了所有 Promise 实例的返回值。
Promise.race
Promise.race 可以将多个 Promise 实例包装成一个新的 Promise 实例,该新 Promise 实例的状态由最先完成的 Promise 实例的状态决定。
比如,我们有三个 Promise 实例 p1、p2、p3,可以使用 Promise.race 将它们包装成一个新的 Promise 实例:
Promise.race([p1, p2, p3]) .then(value => { console.log(value); }) .catch(error => { console.error(error); });
其中,value 是最先完成的 Promise 实例的返回值。
Promise.reject
Promise.reject 可以创建一个新的 Promise 实例,该实例的状态为 rejected,并抛出一个错误。
Promise.reject(new Error('Something went wrong')) .catch(error => { console.error(error); });
Promise.finally
Promise.finally 可以在 Promise 完成时执行某些操作,无论 Promise 是成功还是失败。
somePromise() .then(result => { console.log(result); }) .catch(error => { console.error(error); }) .finally(() => { console.log('Finished'); });
公共函数库使用 Promise
在公共函数库中,我们经常需要使用 Promise 来处理异步操作。下面是一个示例函数库,其中使用了封装后的 Promise 方法:
const asyncFn1 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Async Fn1 Response'); }, 2000); }); }; const asyncFn2 = () => { return new Promise((resolve, reject) => { setTimeout(() => { reject(new Error('Async Fn2 Error')); }, 1000); }); }; const asyncFn3 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Async Fn3 Response'); }, 500); }); }; const asyncFn4 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Async Fn4 Response'); }, 2000); }); }; const asyncFn5 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Async Fn5 Response'); }, 3000); }); }; const asyncFunctions = [asyncFn1, asyncFn2, asyncFn3, asyncFn4, asyncFn5]; const runParallel = async () => { try { const responses = await Promise.allSettled(asyncFunctions.map(fn => fn())); console.log(responses); } catch (error) { console.error(error); } }; const runSeries = async () => { try { const responses = []; for (let i = 0; i < asyncFunctions.length; i++) { try { const response = await asyncFunctions[i](); responses.push(response); } catch (error) { console.error(error); } } console.log(responses); } catch (error) { console.error(error); } }; runParallel(); runSeries();
其中,asyncFunctions 数组包含了五个 Promise 函数,runParallel 函数使用 Promise.allSettled 方法并行执行这些函数,runSeries 函数使用 for 循环逐个执行这些函数。
总结
在使用 Promise 的过程中,需要注意 Promise 的错误处理、并发执行、取消等问题。为了方便复用,可以将这些通用的 Promise 方法封装成公共函数库。在公共函数库中,可以使用 Promise 处理异步操作,并使用封装后的 Promise 方法处理 Promise 的常见问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a5e649add4f0e0ffe77d68