the*_*h92 104 promise angularjs q
我在angularjs中实现了$ q.all,但我无法使代码工作.这是我的代码:
UploadService.uploadQuestion = function(questions){
var promises = [];
for(var i = 0 ; i < questions.length ; i++){
var deffered = $q.defer();
var question = questions[i];
$http({
url : 'upload/question',
method: 'POST',
data : question
}).
success(function(data){
deffered.resolve(data);
}).
error(function(error){
deffered.reject();
});
promises.push(deffered.promise);
}
return $q.all(promises);
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器调用服务:
uploadService.uploadQuestion(questions).then(function(datas){
//the datas can not be retrieved although the server has responded
},
function(errors){
//errors can not be retrieved also
})
Run Code Online (Sandbox Code Playgroud)
我认为在我的服务中设置$ q.all存在一些问题.
Ila*_*mer 222
在javascript中block-level scopes不仅有function-level scopes:
阅读有关javaScript作用域和提升的文章.
var deferred = $q.defer();
deferred.count = i;
console.log(deferred.count); // 0,1,2,3,4,5 --< all deferred objects
// some code
.success(function(data){
console.log(deferred.count); // 5,5,5,5,5,5 --< only the last deferred object
deferred.resolve(data);
})
Run Code Online (Sandbox Code Playgroud)
var deferred= $q.defer();在for循环中写入它时,它被提升到函数的顶部,这意味着javascript在函数范围之外声明了这个变量for loop.closure scope执行函数后仍保留.angular.forEach:这是一个演示插件:http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p = preview
UploadService.uploadQuestion = function(questions){
var promises = [];
angular.forEach(questions , function(question) {
var promise = $http({
url : 'upload/question',
method: 'POST',
data : question
});
promises.push(promise);
});
return $q.all(promises);
}
Run Code Online (Sandbox Code Playgroud)
Array#map:这是一个演示插件:http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p = preview
UploadService.uploadQuestion = function(questions){
var promises = questions.map(function(question) {
return $http({
url : 'upload/question',
method: 'POST',
data : question
});
});
return $q.all(promises);
}
Run Code Online (Sandbox Code Playgroud)
Zer*_*tin 35
$ http也是一个承诺,你可以使它更简单:
return $q.all(tasks.map(function(d){
return $http.post('upload/tasks',d).then(someProcessCallback, onErrorCallback);
}));
Run Code Online (Sandbox Code Playgroud)
Dav*_*yon 12
问题似乎是你正在添加deffered.promisewhen deffered本身就是你应该添加的承诺:
尝试更改为,promises.push(deffered);因此您不要将未包装的承诺添加到数组中.
UploadService.uploadQuestion = function(questions){
var promises = [];
for(var i = 0 ; i < questions.length ; i++){
var deffered = $q.defer();
var question = questions[i];
$http({
url : 'upload/question',
method: 'POST',
data : question
}).
success(function(data){
deffered.resolve(data);
}).
error(function(error){
deffered.reject();
});
promises.push(deffered);
}
return $q.all(promises);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159566 次 |
| 最近记录: |