AngularJS deferred.reject无法正常工作,但$ q.reject正在工作
我对推迟的Angular JS和$ q之间感到困惑。我发现这个SO Question解释$q.defer()
和$q
。它的区别解释
$ q.reject是一个快捷方式创建一个延迟,然后拒绝立即
所以$q.reject()
必须等于
var deferred = $q.defer(); deferred.reject()
,如果不是请说明两者的实际区别。
但在我的情况下,$q.reject()
正在工作,但deffered.reject()
不起作用。此外,我们需要返回拒绝承诺,如$q.reject()
但不是deferred.reject()
。我所看到的例子那里是deffered.reject()
这不归是,这是不工作的代码
var deferred = $q.defer();
myService.getData()
.then(function(response){
deferred.notify('Just a notification');
deferred.reject('rejected');
})
.then(function(response) {
console.log('done');
}, function(response) {
console.log('rejected');
})
,但是当我更换deferred.reject
与$q.reject()
,承诺已被拒绝,并且控制移到随后的错误功能块。
任何帮助,非常感谢。提前致谢。
当您使用deferred.reject
时不起作用,因为您没有返回新的被拒绝承诺。在这两种情况下,您只需使用$q.reject()
和deferred.reject()
即可退货。
你需要明白,
-
$q.reject()
被拒绝承诺对象 -
deferred.reject()
是不承诺,但推迟其在它的一个属性已经拒绝承诺对象(即$promise
)。
因此,您可以返回任何对象或值,它将成为一个新的承诺对象,并将传递给链中的下一个块。然而,当你return deferred.reject()
它将被作为一个对象传递(再一次,这不是承诺,但它有承诺在内),当然下一个承诺将得到成功解决。
它将与deferred
正常工作太多,如果你返回相应的承诺:
var deferred = $q.defer();
myService.getData()
.then(function(response) {
deferred.notify('Just a notification');
deferred.reject('rejected');
return deferred.promise;
//return $q.reject();
})
.then(function(response) {
console.log('done');
}, function(response) {
console.log('rejected');
});
最后回答你的问题:$q.reject()
与地位的承诺对象“拒绝”。 deferred.reject()
是不是一个承诺,但它拒绝承诺对象里面为deferred.$promise
。要使用什么?你应该使用$q.reject()
,在这种情况下使用虚拟延迟对象是多余的,并被认为是不好的做法,事实上它甚至有一个名称为deferred anti-pattern。
确保你已经回复了承诺。
function getData() {
var deferred = $q.defer();
myService.getData()
.then(function (response) {
deferred.resolve('Just received a notification');
}).catch(function (err) {
deferred.reject(err);
};
return deferred.promise;
}
getData().then(function (response) {
console.log('done');
}, function (response) {
console.log('rejected');
});
我实际上有这个代码片段在我的控制器里面,请你解释一下为什么我应该返回一个承诺 – Wishnu
当然,承诺是'.then','.catch','.finally'的属性,所以你必须返回承诺,以便它可以实现。当你做'$ q.reject'时,你返回一个履行了诺言,尽管被拒绝了。 –
这正与Q(https://github.com/kriskowal/q)
var def = Q.defer();
def.promise
.then(
function(ok){
return ok;
},
function(err){
var d = Q.defer();
d.reject(err);
return d.promise;
}
)
.then(
function(ok){
console.log('ok',ok);
},
function(err){
console.log('err',err);
}
);
def.reject('error');
它不会在您的情况在所有的工作,你链式'。然后(功能(响应...'到诺言'.getData( )'已经返回了,而不是延迟'已经返回的承诺,为什么这个工作没有意义? –