我已经阅读了关于$ q的每篇文章,但不知怎的,我无法理解它。例如,我找到了最好的article。我得到了:
var myFirstDeferred = $q.defer(); //Actually I don't even get this far
延迟表示异步操作的结果。它公开了一个接口,可用于发信号通知状态及其所代表的操作结果。它还提供了获取关联的promise实例的方法。
'延迟&#39 ;?它与承诺有何不同?然后我们来看看:
async(function(value) {
myFirstDeferred.resolve(value);
}, function(errorReason) {
myFirstDeferred.reject(errorReason);
});
我不知道这是做什么的。我想强调我理解异步。我理解诺言结构。例如,我确切知道下面的代码在做什么:
$http.get(url)
.then(function(result){returnresult}
,function(error){return error})
但是我们在上面的对象中使用延迟做了什么?为什么甚至延迟了呢?为什么不只是当时的块?
编辑:我想强调一下,我在这里收到了大量的回复以及文章。我认为$ q的重点是执行异步调用的力量(有点像#34; await"在c#中),然后执行一些代码。我真的不明白它是如何做到的。我确实了解.all命令在等待example中的多个异步操作时是如何工作的,但是没有。
编辑:此编辑是对duplicate suggestion的回应 - 我不同意这个概念。首先,这个问题更集中,范围有限。此外,这里接受的答案比其他q中的宽网答案更清楚(imo)。
答案 0 :(得分:2)
通常,您不必明确使用延迟。如果您发现自己使用$q.defer
,则应该质疑为什么不直接使用promise接口。 See the bluebird
documentation for a description of why。 $http
和许多其他库在内部使用延迟并从它们公开的方法返回promises,因此在此基础上使用deferreds是不必要的。
话虽这么说,延期可能是有用的,理解它们很重要。通常,延迟有两种方法:.reject
和.resolve
。老实说,可以使用一种方法来标记异步操作的结果:
.reject -> the asynchronous operation failed or could not complete
.resolve -> the asynchronous operation completed successfully
当延迟完成时,它会触发承诺回调。
在处理异步但没有内置承诺界面的操作(如计时器)时,您需要使用$q.defer
或延迟:
var dfd = $q.defer();
$timeout(function () {
// this is asynchronous
// it completed successfully
dfd.resolve("some value");
}, 500);
dfd.promise.then(function (value) {
assert.equal(value, "some value");
});
而不是将延迟用作对象接口,Angular allows you to use these destructured as function arguments to $q
重写上述内容:
var promise = $q(function (resolve) {
$timeout(function () {
resolve("some value");
}, 500);
});
promise.then(function (value) {
assert.equal(value, "some value");
});
答案 1 :(得分:1)
延迟对象只是一个承诺的子集,只给你.reject和.resolve,这可以防止外界对它做任何其他事情。如果您无法返回承诺(例如使用基于回调构建的库而非承诺),请进行延期并手动拒绝或解决。
deferred.reject
和deferred.resolve
仅在您退回延期时才有意义。基本上是:
somePromise().then( function() {
var deferred = q.defered();
someFunctionThatHasCallback( function() {
deferred.resolve();
});
return defererd;
}).then( function() {
console.log( 'I wait for deferred.resolve' );
});
如果你的函数返回promises,你就不需要延期,因为promises可以通过返回.then
somePromise().then( function() {
return someFunctionThatReturnsPromise();
}).then( function() {
console.log( 'I wait for promise to resolve' );
});