里面的承诺 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 就是你想要的。但至少,您应该知道您当前的实施有什么问题。
我是 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 就是你想要的。但至少,您应该知道您当前的实施有什么问题。