我对Angular JS deferred和$ 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()
时,承诺被拒绝,控件被移动到随后阻塞的错误函数。
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:5)
当您使用deferred.reject
时,它不起作用,因为您没有返回新拒绝的承诺。您可以同时使用$q.reject()
和deferred.reject()
两种情况下都需要返回承诺。
您需要了解
$q.reject()
被拒绝承诺对象deferred.reject()
不是一个承诺,但延迟对象在其某个属性中拒绝了承诺(即$promise
)。因此,您可以返回任何对象或值,它将成为新的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的名称。
答案 1 :(得分:2)
确保您要回复承诺。
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');
});
答案 2 :(得分:0)
这适用于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');