AngularJS - 无法获得$ q.reject和工作
看看我的代码示例:
我已经剥离下来到(我认为是)最基本的要素,和我设置得到一个错误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调用的结果,为了了解这些承诺对象而言的工作,我想看看我是否能得到这工作通过宣布并返回deferred
如上所示
谢谢!
你正在创建自定义的承诺,从你的方法还,但意味着在处理它要覆盖deferred
(自定义承诺对象)与$http.get
,这也返回一个具有.then
& .catch
方法(它没有承诺resolve
& reject
方法)。由于该分配,您无法访问来自deferred
对象的.resolve
和.reject
。
deferred = $http.get('my/api/method', { params: { id: id } })
应该只有
$http.get('my/api/method', { params: { id: id } })
谢谢@PankajParkar。这里我还有点不清楚。如果它被赋值为$ http.get的返回结果的值,那么这基本上不会意味着它的值吗? – Ricky
@Ricky不..没有什么承诺的工作..承诺意味着你说,我有东西要返回&我会在一段时间后..这就是为什么你创建'var deferred = $ q.defer(); '当你收到一个响应时,你可以用数据'reject'来解析数据,使用相同的数据。如果你做'deferred = $ http.get('my/api/method',{params:{id:它将清除整个对象传统'$ http.get'承诺对象将在其中引入.. –
由于$http.get()
回报承诺和成功回调支持链式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()
调用。
'$ http.get()'返回承诺,但不延迟 – Vadim
@Vadim:我不明白。你可以请Elbourate? – Ricky
我指的是'deferred = $ http.get()'字符串。这是不正确的,因为'$ http.get()'不会返回延迟对象,但它是承诺的。所以,你可以返回'$ http.get' – Vadim