什么是'延期'在$ q?

时间:2015-09-10 02:55:40

标签: angularjs angular-promise deferred

我已经阅读了关于$ 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)。

2 个答案:

答案 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.rejectdeferred.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' );
});