AngularJS中Promise嵌套Promise.all仅返回第一个结果的问题求助
解决AngularJS中Promise.all嵌套后只返回第一个结果的问题
嘿,刚接触AngularJS的Promise确实容易踩坑,我来帮你捋捋~首先咱们先看看你原代码里的小问题,再一步步改成符合需求的写法。
先说说原代码里的Promise反模式
你原来手动创建$q.defer()其实是没必要的,因为$scope.fillInPOInitial(orders)本身就返回了一个Promise,咱们直接利用Promise的链式调用就行,不用手动去resolve/defer,这样代码更简洁也不容易出错。
针对你的需求修改后的代码
假设你的需求是:先执行fillInPOInitial完成初始化,然后批量调用PurchaseOrderFactory.getPurchase...获取数据,等所有这些请求都完成后,再让整个fillInRO方法的Promise完成。那代码可以改成这样:
$scope.fillInRO = function (data){ $scope.receive_order = data.receive_order; var orders = _.map(data.receive_order.purchase_orders, function (value) { return {purchase_order: value}; }); // 利用Promise链式调用,去掉手动defer return $scope.fillInPOInitial(orders) .then(function() { // 生成所有需要执行的异步请求Promise数组 let promises = ids.map((id, index) => { // 这里补全你的PurchaseOrderFactory调用,比如getPurchaseOrder(id) return PurchaseOrderFactory.getPurchaseOrder(id); }); // 用$q.all等待所有Promise完成,它会返回一个包含所有结果的数组 return $q.all(promises); }) .then(function(allPurchaseResults) { // 这里可以处理所有返回的采购订单数据,比如赋值给scope $scope.purchaseOrders = allPurchaseResults; // 如果需要把结果返回给调用这个方法的地方,就return对应数据 return allPurchaseResults; }) .catch(function(error) { // 不要吞掉错误,添加错误处理方便调试 console.error('处理过程中出错:', error); // 把错误继续传递给调用方 throw error; }); }
如果需要并行执行两个操作
要是你不需要等fillInPOInitial完成再去请求采购订单,而是想让它们并行执行(提高效率),可以改成这样:
$scope.fillInRO = function (data){ $scope.receive_order = data.receive_order; var orders = _.map(data.receive_order.purchase_orders, function (value) { return {purchase_order: value}; }); // 同时执行初始化和批量采购订单请求 const initPromise = $scope.fillInPOInitial(orders); const purchasePromises = $q.all(ids.map(id => PurchaseOrderFactory.getPurchaseOrder(id))); // 用$q.all等待两个操作都完成 return $q.all([initPromise, purchasePromises]) .then(function(results) { // results[0]是fillInPOInitial的执行结果,results[1]是所有采购订单的数组 $scope.purchaseOrders = results[1]; return results; }) .catch(function(error) { console.error('出错了:', error); throw error; }); }
为什么你之前只拿到第一个Promise的结果?
大概率是因为你没有正确返回$q.all的Promise,或者还在使用手动defer的方式,在第一个请求完成时就调用了defer.resolve(),而没有等待所有批量请求完成。改用链式调用后,每一步的return都会把后续的Promise传递下去,就能保证所有异步操作都完成后再返回结果啦。
内容的提问来源于stack exchange,提问作者user6080689
相关产品推荐
相关产品推荐

