【问题标题】:AngualrJS nest Promise.all in Promise only return the firstAngularJS 在 Promise 中嵌套 Promise.all 只返回第一个
【发布时间】:2018-04-13 16:55:38
【问题描述】:

提前致谢。我是新来的,并且坚持 AngularJs 的承诺。 原代码为:

$scope.fillInRO = function (data){
  var defer = $q.defer();
  $scope.receive_order = data.receive_order;
  var orders = _.map(data.receive_order.purchase_orders,function (value) {
    return {purchase_order:value};
  });
  $scope.fillInPOInitial(orders).then(
    function (){
      defer.resolve();
    }
  )
  return defer.promise;
} 

现在我需要添加另一个 Promise.all

let promises = ids.map((id,index) => {
        PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
        $scope.receive_order.receive_order_items[index].receive_order_item.display_unit = res.purchase_items[index].display_unit
      })
    })

通过console.log知道res是:

res = {
  purchase_items:[
    {display_unit: "kg"},
    {display_unit: "g"},
  ]
}

请求前,左值喜欢:

$scope.receive_order.receive_order_items = [
  {receive_order_item:{display_unit: null}},
  {receive_order_item:{display_unit: null}},
]

请求后,值为like:

$scope.receive_order.receive_order_items = [
  {receive_order_item:{display_unit: "kg"}},
  {receive_order_item:{display_unit: null}},
]

但我想要的是这样的:

$scope.receive_order.receive_order_items = [
  {receive_order_item:{display_unit: "kg"}},
  {receive_order_item:{display_unit: "g"}},   // here the diff
]

我不知道如何正确地将 promise.all 嵌套在 promise 中,我尝试这样做:

  $q.all(promises).then(() =>{
    $scope.fillInPOInitial(orders).then(
      function (){
        defer.resolve()
      }
    )
  })

好像没什么区别,我还是把第二个值设为null:

$scope.receive_order.receive_order_items = [
  {receive_order_item:{display_unit: "kg"}},
  {receive_order_item:{display_unit: null}},
]

有什么想法吗?

【问题讨论】:

  • 我想知道错误是否出现在对ids.map 的调用中 - 使用ids 数组中的采购订单ID 的索引作为@987654331 中元素的索引有些臭味@在回复中。如果每个采购订单有多个采购项目,您可能需要另一个循环
  • 谢谢!你解决了我的问题:)

标签: javascript angularjs promise angular-promise


【解决方案1】:

promises 不会在 promises 数组中返回,您在 promises 被解析之前访问值,因此您无法获得正确的值。

let promises = ids.map((id,index) => {
         return PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
        $scope.receive_order.receive_order_items[index].receive_order_item.display_unit = res.purchase_items[index].display_unit
      })
    })

然后传递给$q.all(promises )

【讨论】:

  • @T.Judy 返回值以及 Promise:return res.purchase_items[index].display_unit;
【解决方案2】:

感谢@mzulch,我发现 AngularJs Promise 没有任何问题。错误在于对 ids.map 的调用 添加另一个循环,问题就解决了:

  let promises = ids.map((id) => {
    PurchaseOrderFactory.getPurchaseOrder(id,store_id).then(function(res){
      res.purchase_items.map((purchase_item, index) => {
        data.receive_order.receive_order_items[index].receive_order_item.display_unit = purchase_item.display_unit
      })
    })
  }) 

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2014-02-21
    • 2020-02-08
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多