我需要在一个承诺中从$http调用返回一个定制的响应,这样我就可以链接更多的调用。我有两个可用的实现。有人能解释一下两者之间的区别,并争论一下一个是否更好吗?
在fooService.js中
实现#1
function foo() {
var deferred = $q.defer();
return $http.get('some-http-url')
.then(function(response) {
var data = response.data.Data;
// Some manipulation on data
deferred.resolve(data);
return deferred.promise;
});
}实现#2
function foo() {
return $http.get('some-http-url')
.then(function(response) {
var data = response.data.Data;
// Some manipulation on data
return $q.resolve(data);
});
}然后在FooController.js
fooService.foo().then(function(response) {
// Do something
});P.S.欢迎一些能给我更好理解的链接。。
*更新2017年10月4日*
如果我像这样修改函数foo()
实现#1
function foo() {
var deferred = $q.defer();
if(/*some condition*/) {
deferred.resolve('data');
return deferred.promise;
}
else {
deferred.reject('error');
return deferred.promise;
}
}实现#2
function foo() {
if(/*some condition*/)
return $q.resolve('data');
else
return $q.reject('error');
}哪一种是首选的方法?
发布于 2017-10-04 08:25:49
这里根本不需要$q,因为$http已经回报承诺了。只需返回.then()中的数据,链中的下一个.then()就可以使用该数据:
function foo() {
return $http.get('some-http-url')
.then(function(response) {
return response.data.Data;
});
}您的实现方式称为https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern,这个答案中有更多信息。
https://stackoverflow.com/questions/46560170
复制相似问题