$q.resolve() 与 deferred.resolve() - AngularJS 之间的区别
Difference between $q.resolve() vs deferred.resolve() - AngularJS
我需要 return 来自 $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');
}
首选哪种方式?
您不需要 $q
here at all, because $http
already returns a promise。
.then()
中只有 return 数据,它将可用于链中的下一个 .then()
:
function foo() {
return $http.get('some-http-url')
.then(function(response) {
return response.data.Data;
});
}
您执行实施的方式称为 deferred antipattern, more info in this answer。
我需要 return 来自 $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');
}
首选哪种方式?
您不需要 $q
here at all, because $http
already returns a promise。
.then()
中只有 return 数据,它将可用于链中的下一个 .then()
:
function foo() {
return $http.get('some-http-url')
.then(function(response) {
return response.data.Data;
});
}
您执行实施的方式称为 deferred antipattern, more info in this answer。