里面的承诺 Angular.forEach

Promise inside Angular.forEach

我是 Angular 的新手,我完全答应并尝试寻找有关但我不太了解的现有帖子.. 我的问题是我有一个列表 (schedulesLst),我在其中迭代以获取相关数据,将其添加到新列表中。

$scope.sessionLst=[];
  function createSession(scheduleLst){
  var session={};
  var sessionLst=[];
    angular.forEach(scheduleLst, function(sch){
      Jobschedule.findById({
        id:sch.id
      }).$promise.then(function (data) {
        session=data;
        session.ambassadorid=sch.ambassadorId;
        session.status=CoreService.jobStatus.Assigned;
      });
      sessionLst.push(session);
    });
    $scope.sessionLst=sessionLst;
  }

如果 findById() 正在返回一个真实的承诺,那么下面的代码应该只需要 .then

$scope.sessionLst=[];
function createSession(scheduleLst) {
    var session = {};
    var sessionLst = [];
    angular.forEach(scheduleLst, function (sch) {
        Jobschedule.findById({
            id: sch.id
        }).then(function (data) {
            session = data;
            session.ambassadorid = sch.ambassadorId;
            session.status = CoreService.jobStatus.Assigned;
            $scope.sessionLst.push(session);
        });
    });
}

有关 $q 的更多信息,请阅读文档 - https://docs.angularjs.org/api/ng/service/$q

var session={};
var sessionLst=[];
angular.forEach(scheduleLst, function(sch){
  Jobschedule.findById({
    id:sch.id
  }).$promise.then(function (data) {
    session=data;
    session.ambassadorid=sch.ambassadorId;
    session.status=CoreService.jobStatus.Assigned;
  });
  sessionLst.push(session);
});

我们来分析一下上面的代码

您创建了一个空对象:session.

然后你创建一个空数组:sessionLst.

然后,对于 scheduleLst 的每个元素,你做一些事情。

在每次迭代中,您调用 Jobschedule.findById。稍后,当 promise 被 resolved 时,就会发生一些事情。但与此同时,您将空 session 对象推入 sessionLst.

所以你最终得到一个包含相同空会话对象多次的列表。

现在有些时候过去了,承诺最终得到了解决。他们各自重新分配 session 变量,但保持数组不变。

您实际上想要的是拥有许多会话对象,一旦您从已解决的承诺中获取它们,它们就应该进入数组:

var sessionLst = [];
angular.forEach(scheduleLst, function(sch){
  Jobschedule.findById({
    id:sch.id
  }).$promise.then(function (data) {
    var session = data;
    session.ambassadorid = sch.ambassadorId;
    session.status = CoreService.jobStatus.Assigned;
    sessionLst.push(session);
  });
});

这可能是您想要的,但也可能不是:sessionLst 的顺序与 seceduleLst 的顺序不同,如果任何承诺失败,您将失去会话并且不会意识到。所以也许 $q.all 就是你想要的。但至少,您应该知道您当前的实施有什么问题。