You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:26:51