看看我的代码示例:
我已经将它剥离到(我相信的)基本要素,并且我设置了错误deferred.reject is not a function
angular
.module('myApp')
.service('myService', MyService);
MyService.$inject = ['$http', '$q'];
function MyService($http, $q) {
var self = this;
self.getResult = getResult;
function getResult(id) {
var deferred = $q.defer();
deferred = $http.get('my/api/method', { params: { id: id } })
.then(getResultCompleted)
.catch(getResultFailed);
function getResultCompleted(response) {
if (response.data.ID > 0) {
deferred.resolve(response.data);
} else {
deferred.reject(response);
}
}
function getResultFailed(response) {
deferred.reject(response);
}
return deferred.promise;
}
}
注意:我知道我可以通过简单地返回$ http调用的结果来实现这一点,但是为了理解这些promise对象,我想知道我是否可以得到这个通过声明并返回deferred
进行工作,如上所示
谢谢!
答案 0 :(得分:3)
您正在创建自定义承诺并从您的方法返回它,但在处理它时意味着您使用deferred
覆盖$http.get
(自定义承诺对象),这也会返回具有{{1的承诺}& .then
方法(没有.catch
& resolve
方法)。由于该分配,您无法从reject
对象访问.resolve
和.reject
。
deferred
应该只是
deferred = $http.get('my/api/method', { params: { id: id } })
答案 1 :(得分:1)
由于$http.get()
返回promise并且成功回调支持链接API,您可以在回调中定义新的延迟对象并从那里返回:
angular
.module('myApp')
.service('myService', MyService);
MyService.$inject = ['$http', '$q'];
function MyService($http, $q) {
var self = this;
self.getResult = getResult;
function getResultCompleted(response) { // Tip: Define callback outside of getResult in order to avoid creating new instance of it each time getResult is called
var deferred = $q.defer();
if (response.data.ID > 0) {
deferred.resolve(response.data);
} else {
deferred.reject(response);
}
return deferred.promise;
}
function getResult(id) {
return $http.get('my/api/method', { params: { id: id } })
.then(getResultCompleted);
}
}
注意,不再有错误回调(因为在这种情况下它是多余的)。
如果请求失败,将返回$http.get()
的原始拒绝承诺,否则成功回拨的全新承诺将用于后续.then()
来电。