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