在 JavaScript 中,对 Promise 进行二次封装通常意味着创建一个新的 Promise,它依赖于一个或多个现有的 Promise。这种封装可以用于扩展 Promise 的功能、统一处理异步操作或简化异步逻辑的代码。
以下是一些常见的二次封装 Promise 的场景和方法:
1. 封装异步操作
当你有多个异步操作需要按顺序执行时,你可以创建一个封装函数,按顺序执行这些操作。
function sequencePromise(promiseFactories) {
return promiseFactories.reduce(((promise, factory) => promise.then(factory));
}, Promise.resolve());
}
使用:
sequencePromise.resolve()
.then(fetchUser)
.then(fetchPosts)
.then(fetchComments));
等同于:
sequence([
() => fetchUser(),
() => fetchPosts(),
() => fetchComments()
]);
统一错误处理
封装 Promise 可以添加统一的错误处理逻辑,这样你就不需要在每个 .then()
或 .catch()
调用中处理错误。
function safeFetch(url) {
return fetch(url).catch(error => {
console.error('Fetch error:', error);
throw error;
});
});
封装 API 请求
如果你有多个 API 请求,你可以创建一个函数来处理所有请求,并在所有请求完成后解析结果。
function fetchAll(urls) {
const promises = urls.map(url => fetch(url));
return Promise.all(promises);
}
封装为异步函数
有时候,你可能想要将一个普通的异步函数封装为 Promise。
function asyncFunction(fn, ...args) {
return new Promise((resolve, reject) => {
fn(...args, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
使用:
asyncFunction(myAsyncFunction, arg1, arg2);
封装为类方法
如果你正在使用类和 async/await 语法,你可能想要封装一个类方法为返回一个 Promise。
class MyClass {
async myAsyncMethod() {
return 'done';
}
}
const myClass = new MyClass();
myClass.myAsyncMethod().then(result => console.log(result));
封装为:
class MyClass {
asyncMethod() {
return this.myAsyncMethod();
}
}
这些示例展示了如何对 Promise 进行二次封装,以满足不同的需求。在实际应用中,你可能需要根据具体场景和需求选择合适的封装方式。