如何用Promise等待多API请求结果后执行依赖函数(附代码)
用Promise.all优雅解决多异步请求等待问题
嘿,这个场景刚好是Promise.all的拿手好戏!你现在用的是回调式的API调用,咱们只需要把这两个请求转换成Promise,就能完美实现“等两个请求都返回再执行依赖函数”的需求,完全不需要setTimeout这种hack写法~
第一步:把回调式的API包装成Promise
首先,咱们把每个JA.get请求都包装成返回Promise的函数,这样就能利用Promise的异步管理能力了:
// 包装获取发票的请求 function getInvoices(companyId) { return new Promise((resolve, reject) => { JA.get(`api/${companyId}/Invoicing`, (err, data) => { if (err) { reject(err); // 请求失败时抛出错误 return; } resolve(data); // 请求成功时返回数据 }); }); } // 包装获取费用的请求 function getExpenses(companyId) { return new Promise((resolve, reject) => { // 这里替换成你实际的费用API路径 JA.get(`api/${companyId}/Expenses`, (err, data) => { if (err) { reject(err); return; } resolve(data); }); }); }
第二步:用Promise.all等待所有请求完成
接下来,用Promise.all来同时发起两个请求,它会等待所有Promise都成功resolve后,才会进入.then回调;如果其中任何一个请求失败(reject),会直接进入.catch处理错误:
// 假设你已经有companyId变量 const companyId = "你的公司ID"; // 同时发起两个请求,等待全部完成 Promise.all([getInvoices(companyId), getExpenses(companyId)]) .then(([invoicesData, expensesData]) => { // 这里两个请求的数据都已经拿到啦! var invoices = invoicesData; var expenses = expensesData; var invoicesTotal = 0; var expensesTotal = 0; // 这里写你计算total的逻辑,比如: invoicesTotal = invoices.reduce((sum, item) => sum + item.amount, 0); expensesTotal = expenses.reduce((sum, item) => sum + item.amount, 0); // 现在执行你的依赖函数! yourDependencyFunction(invoicesTotal, expensesTotal); }) .catch((error) => { // 处理任何一个请求失败的情况 console.error("请求出错了:", error); });
关键说明:
Promise.all([p1, p2])会接收一个Promise数组,只有当p1和p2都成功时,才会把两个请求的结果按顺序放到.then的数组参数里(也就是[invoicesData, expensesData])。- 完全不需要
setTimeout,因为Promise内部已经帮你处理了异步等待的逻辑,比定时器靠谱多了——定时器没法准确判断请求到底什么时候完成,而Promise是基于实际的请求状态的。 - 别忘了加上
.catch处理错误,避免某个请求失败导致整个流程卡住。
内容的提问来源于stack exchange,提问作者nick.cook
相关产品推荐
相关产品推荐

