当前位置: 首页 > 知识库问答 >
问题:

Qpromise什么时候执行?

梁华皓
2023-03-14

我在理解promise方面有一个(看似基本的)问题。首先是代码:

'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);
});

每个promise函数在添加到promise数组时被调用,而不是像我所想的那样调用Q.all。

我有什么不明白的?

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

共有3个答案

岳迪
2023-03-14

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

'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);
});

请注意,无论您是否调用,延迟功能都将运行。然后兑现promise。

亢建木
2023-03-14

令人困惑的是,您理解为惰性计算而设计的promise API,但事实并非如此。

promise是处理长时间运行的请求的一种方式,它们旨在立即启动以最大限度地减少等待时间,并利用链接和连接来澄清如何处理这些长时间运行的请求的结果。

您可以尝试使用api Q-Lazy,它允许您延迟promise的调用,直到它们被订阅。

朱昊乾
2023-03-14

>

函数的作用是:创建一个延迟的promise,并返回相关的promise。它还设置了一个计时器,用于将来解析返回的promise。

Q. all()只是等待3个promise被解决。(从技术上讲,它返回一个新的promise,当前3个promise被解决时,这个promise将被解决)

如果您想一个接一个地执行这三个异步函数,我建议您使用优秀的异步函数。js库。它提供了许多异步流控制原语。在您的情况下,您可能对串联或瀑布方法感兴趣。

 类似资料:
  • 桌子上有一个重组, 我能知道重建的日期吗?像2017年1月1日这样的日期 这个查询将在创建表时提供给我。它不包含关于reorg的信息

  • 本文向大家介绍什么时候用delegate,什么时候用Notification?相关面试题,主要包含被问及什么时候用delegate,什么时候用Notification?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,recieve

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 我创建了一个类(正如书中所说)来保存从键盘输入的一个人的姓名和姓氏,然后还有另一个类,它将一个人的国家代码、区号和号码封装为字符串 Person将用作Hashmap中的键 Class封装了和。许多对象组成了一个表示电话簿的HashMap。 实现了

  • 问题内容: 我有一个将客户发送到另一个站点来处理付款的应用程序。客户之外的另一个站点在我们的服务器上调用一个页面,让我们知道付款的状态。被调用页面会检查付款应用程序提供的参数,并检查我们是否知道该交易。然后,它更新数据库以反映状态。这一切都无需与客户进行任何互动即可完成。 我个人选择将此功能实现为JSP,因为将文件拖放到文件系统中比编译和打包文件然后将条目添加到配置文件中要容易得多。 考虑到页面的

  • 问题内容: 我想要的不是Redis和MongoDB之间的比较。我知道他们是不同的。性能和API完全不同。 Redis的速度非常快,但是API的“原子性”非常好。MongoDB将占用更多资源,但是该API非常易于使用,对此我感到非常满意。 它们都很棒,我想在部署中尽可能多地使用Redis,但是很难编写代码。我想在开发中尽可能多地使用MongoDB,但是它需要一台昂贵的机器。 那么您如何看待两者的使用