Angular.forEach中的承诺

时间:2016-03-10 06:21:17

标签: angularjs angular-promise

我是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;
  }

2 个答案:

答案 0 :(得分:1)

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的顺序相同,如果任何一个promises失败,你将失去会话并赢得&请注意。所以也许$ q.all就是你想要的。但至少,您应该了解当前实施的错误。

答案 1 :(得分:0)

如果.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); }); }); } 以下代码:

IF NOT EXISTS (SELECT * FROM customers_testing WHERE XXXXX)
BEGIN
    ...[your existing SQL]...
END

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