【发布时间】:2016-09-07 16:42:19
【问题描述】:
从事移动科尔多瓦/角度项目。下面是一个简单的服务调用:
this.getSomeData = function (businessId) {
var deferred = $q.defer();
var query = "SELECT * FROM Stuff";
$cordovaSQLite.execute(db, query).then(function (res) {
deferred.resolve(res.rows);
}, function (err) {
deferred.reject(err);
});
return deferred.promise;
};
问题很简单:
for (var k = 0; k < count; k++) {
myService.getSomeData($scope.model.stuff[k].id, k).then(function (data) {
// whatever
}
);
getSomeData 是异步的,所以当它返回时,for 循环中的k 远不正确。
我想过将k作为参数传递给服务方法:
for (var k = 0; k < count; k++) {
myService.getSomeData($scope.model.stuff[k].id, k).then(function (data) {
// whatever
}
);
并相应地更改服务方法:
this.getSomeData = function (id, index) {
var deferred = $q.defer();
var query = "SELECT * FROM Stuff";
$cordovaSQLite.execute(db, query).then(function (res) {
deferred.resolve(res.rows, index);
}, function (err) {
deferred.reject(err);
});
return deferred.promise;
};
但是第二个参数被忽略并且始终未定义。
如何克服这个问题?
【问题讨论】:
-
@JLRishe 你为什么重新打开这个?
-
@Bergi 因为你指出的问题不是这个问题的答案。答案是
$q.all()。 -
@JLRishe:不,回调中
k的问题通过使用map其中the closure is created 隐式在您的答案中得到缓解。这与all无关。 -
@Bergi OP 提供的代码没有循环变量的闭包。 OP 没有向我们展示的代码中可能存在一个问题(文本似乎确实暗示了这一点),虽然对循环变量的闭包可能是这里的根本问题,但我认为最好提供一种惯用的解决方案承诺而不是指示 OP 通过解决关闭问题来拼凑解决方案。
标签: javascript angularjs cordova promise angular-promise