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;
  }
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 。稍后,当承诺得到解决时,就会发生一些事情。但与此同时,您将空的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一切都是你想要的。但至少,你应该了解你当前的实现有什么问题。

如果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

最新更新