繁体   English   中英

Q承诺何时得到执行?

[英]When do Q promises get executed?

我有一个(看似基本的)问题理解承诺。 首先是代码:

'use strict';

var Q = require("q");

var mockPromise = function (statement) {
    var deferred = Q.defer();

    console.log("I'm running before I'm queued ...");

    setTimeout(function () {
        deferred.resolve(statement);
    }, 5000);

    return deferred.promise;
};

var promises = [
    mockPromise("1st statement"),
    mockPromise("2nd statement"),
    mockPromise("3rd statement")
];

Q.all(promises)
.then(function (results) {
    console.log(results);
});

每个诺言函数都会在将其添加到诺言数组时调用,而不是像我想的那样调用Q.all时。

我什么不来?

如何在不立即调用所说的承诺的情况下将一系列的承诺排队?

似乎混淆之处在于您了解为延迟评估而设计的promise API,事实并非如此。

承诺是处理长时间运行的请求的一种方式,它们的设计目的是立即启动以最小化等待时间,并利用链接和连接来阐明应如何处理这些长时间运行的请求的结果。

您可能会尝试利用api Q-Lazy ,它使您可以延迟对Promise的调用,直到它们被订阅为止。

  1. 承诺是对象。 他们没有被“处决”。 他们是“解决”或“拒绝”的。 创建数组时,您将执行三次mockPromise()函数。 此功能在代码的那一点立即执行。

  2. mockPromise()函数创建一个延迟并返回关联的promise。 它还设置了一个计时器来解决将来返回的承诺。

  3. Q.all()只是等待3个诺言被“解决”。 (从技术上讲,它会返回一个新的诺言,该诺言将在之前的三个诺言得到解决时解决)

如果要一个接一个地执行三个异步函数,我建议使用出色的async.js库。 它提供了许多异步流控制原语。 就您而言,您可能对序列瀑布方法感兴趣。

通常,您会推迟异步功能,而不仅仅是值。 例如:

'use strict';

var Q = require("q");

var mockPromise = function (statement) {
    var deferred = Q.defer();

    console.log("I'm running before I'm queued ...");

    setTimeout(function () {
        deferred.resolve(statement());
    }, 5000);

    return deferred.promise;
};

var promises = [
    mockPromise(function() { 
        console.log("running1"); 
        return "1st statement";
    }),
    mockPromise(function() { 
        console.log("running2"); 
        return "2nd statement";
    }),
    mockPromise(function() { 
        console.log("running3"); 
        return "3rd statement";
    }),
];

Q.all(promises)
.then(function (results) {
    console.log(results);
});

需要注意的是延期功能会不管你是否曾经调用运行.then上一个承诺。

让我展示一个使用标准承诺的示例。 它们的工作与Q承诺的工作几乎相同:

 function mockPromise(value) { return new Promise(resolve => { console.log("I'm not running before I'm queued ..."); setTimeout(() => { resolve(value); }, 1000); }); } mockPromise("1st promise").then(x => { console.log(x); return mockPromise("2nd promise"); }).then(x => { console.log(x); return mockPromise("3nd promise"); }).then(x => { console.log(x); }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM