我需要通过 $ http 调用在promise中返回自定义响应,以便我可以链接更多调用。我有两个实现可用。有人可以解释两者之间的区别,并争论一个更好吗?
在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。我们欢迎一些可以让我更好理解的链接。
如果我像这样修改我的函数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');
}
哪种方式首选?
答案 0 :(得分:2)
您根本不需要$q
,因为$http
已经returns a promise。
只需返回.then()
中的数据,它就可用于链中的下一个.then()
:
function foo() {
return $http.get('some-http-url')
.then(function(response) {
return response.data.Data;
});
}
您实施的方式称为deferred antipattern,this answer中有更多信息。