关于承诺的网上所有内容都表示,除了使用angular.js上的docs / examples之外,不要使用promises。
在不使用defer的情况下返回angular.js $ promise值的正确方法是什么?
这是我目前所拥有的:
function foo() {
var deferred = $q.defer();
userService.findProgramsByUser({personId: personId}).$promise
.then(function (programs) {
deferred.resolve(programs);
});
return deferred.promise;
}
如果我正在使用节点Q库,我会这样做:
function foo() {
return Q.promise(function(resolve, reject) {
userService.findProgramsByUser({personId: personId})
.then(function (programs) {
resolve(programs);
});
}
}
如何在不使用延迟的情况下使用角度承诺做类似的事情?
答案 0 :(得分:3)
由于userService.findProgramsByUser()
已经有一个promise属性,只需返回
function foo() {
return userService.findProgramsByUser({personId: personId}).$promise
.then(function (programs) {
return programs;
}, function(){
// handle errors
});
}
答案 1 :(得分:1)
我真的不明白为什么使用延迟是不好的。在大多数情况下,我的服务看起来像:
var defers = {}; //somewhere in the service root.
getData: function(id){
var defKey = 'getData' + id;
if(defers.hasOwnProperty(defKey)) return defers[defKey].promise;
//here is a good spot to return something from custom cache
defers[defKey] = $q.defer();
serverApiRequest('/api/...').then(function(response){
defers[defKey].resolve(response.data);
delete defers[defKey];
});
return defers[defKey].promise;
}
延期承诺很棒。通过这种方法,我们可以100%确定服务器只会被请求一次,并且每个并行请求都将被提供。