在 Q 中链接任意数量的 Promise

2024-02-07

我想发送 N 次 HTTP 请求。我希望最终获得有关每个请求的结果的信息。

运行一次请求函数效果很好。这是使用 Q.defer() 的 HTTP 请求函数:

function runRequest() {
    var deferred = Q.defer(),
        start = (new Date).getTime(),
        req = HTTP.request(options, function(res) {
            var end = (new Date).getTime(),
            requestDetails = {
                reqStatus: res.statusCode,
                reqStart: start,
                reqEnd: end,
                duration: end - start
            }
            deferred.resolve(requestDetails);
        });
    req.on('error', function(e) {
        deferred.reject(e.message);
    });
    req.end();

    return deferred.promise;
}

如果我这样做,我会得到我期望的数据:

runRequest().then(function(requestDetails) {
    console.log('STATUS: ' + requestDetails.reqStatus);
    console.log('Duration: ' + requestDetails.duration);
    console.log('Start: ' + requestDetails.reqStart);
    console.log('End: ' + requestDetails.reqEnd);

}, function(error) {
    console.log('Problem with request: ' + error);
})
.done();

为了迭代,我尝试将其放入 for 循环中:

function iterateRequests() {
    var deferred = Q.defer();
    var reqResults = [];
    for (var iteration = 0; iteration < requests; iteration++) {
        runRequest()
        .then(function(requestDetails) {
            console.log('STATUS: ' + requestDetails.reqStatus);
            reqResults.push(requestDetails);
        }, function(error) {
            console.log('Problem with request: ' + error);
        });
    }
    deferred.resolve(reqResults);
    return deferred.promise;
}

然后我这样称呼它:

iterateRequests()
.then(function(results) {
    console.log(results);
    console.log("in the success callback after iterateRequests");
}, function() {
    console.log("in the failure callback after iterateRequests");
})
.done();

我最终进入成功回调(即,它记录“在 iterateRequests 之后的成功回调中”)。但是,console.log(results) 在我从 runRequest().then() 回调获取日志之前打印,它是一个空数组。

关于链接/迭代承诺返回函数有什么想法或指导吗?

Thanks!

Update跟进问题以回应 @aject_error 的回答:

查看了 Q.all。绝对看起来像我需要的。它比我正在使用的要简单得多。我做了一个简单的测试用例来帮助我弄清楚它是如何工作的:

var Q = require("q");

function returner(number) {
    var deferred = Q.defer();

    deferred.resolve(number);
    return deferred.promise;
}

function parent() {
    return Q.all([
        returner(1),
        returner(2),
        returner(4)
    ]);
}


parent()
.then(function(promises) {
    // works - promises gives me [1, 2, 4]
    console.log(promises);
});

因此,如果我事先知道需要调用它的次数(以及我要调用哪些函数),我就会知道如何使用它。有关如何在数组中获取对 returner (在本示例中)或 runRequest (在我的原始示例中)的动态调用次数的任何提示?


这回答了update问题的一部分:

var buildCalls = function() {

  var calls = [];
  for (var i in stories) {

    calls.push(myFunc(i));
  }
  return calls;
}

return Q.all(buildCalls());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Q 中链接任意数量的 Promise 的相关文章

  • Puppeteer 的行为与开发者控制台不同

    我正在尝试使用 Puppeteer 提取此页面的标题 https www nordstrom com s zella high waist studio pocket 7 8 leggings 5460106 https www nords
  • 如何设置黄瓜环境变量

    我有以下 package json name newcucumber version 1 0 0 main index js scripts test node modules bin cucumber js firefox node mo
  • Puppeteer 无法在 VPS (DigitalOcean) 上工作

    我在水滴中数字海洋 https www digitalocean com 我收到这个错误 node 5549 UnhandledPromiseRejectionWarning TimeoutError Navigation Timeout
  • ExpressJS - 提供通用 Nuxt 应用程序和 AngularJS SPA

    我有一个具有以下结构的博客项目 服务器 用 Node Express 编写 管理员 AngularJS SPA public AngularJS SPA 目前 管理部分和公共部分具有相同的域 但管理部分使用不同的子域 这允许我在 Expre
  • 节点项目的 Azure git 部署失败

    我正在尝试将我的项目部署到azure 它正在失败 这些是我采取的步骤 git init git config core longpaths true git add git commit m initial commit 所有这些都有效 我
  • 如何在 inversify 中注入异步依赖?

    我有 TypeScript 应用程序并且正在使用反转 http inversify io 对于国际奥委会 我有一个连接类 use strict import injectable from inversify import createCo
  • 在使用 supertest 和 Node.js 的测试中,res.body 为空

    我正在测试 Node js API超级测试 https github com visionmedia supertest 我无法解释为什么res body对象超集返回为空 数据显示在res text对象 但不是res body 知道如何解决
  • Node.js“需要”其他文件而不需要命名空间

    我正在将代码库从 100 浏览器端切换为浏览器端和服务器端的混合 我发现的问题是 要让我的代码使用 node js 运行 我必须使用模块 为了将我的代码变成模块 需要对几乎所有代码进行巨大的重构 原因是在浏览器上 许多功能是跨文件使用的 而
  • npm install 没有拉入 devDependency

    我有 npm v 1 2 32 当我跑步时 npm 安装 mongo migrate 它不安装 mongodb 这是一个 devDependency 我究竟做错了什么 虽然与这个问题没有直接关系 但有些人可能有兴趣知道如果环境变量NODE
  • 将 Node.js(用于实时通知)添加到现有 PHP 应用程序

    我有一个现有的 PHP 应用程序 我需要向其中添加实时通知 为了实现这一点 我安装了node js 打算添加socket io以实现所有实时功能 然而 尽管在过去的三个小时里研究并试图弄清楚如何将两者结合起来 但我发现自己并没有更接近于获得
  • npm install 的 --save 选项是什么?

    我看到一些教程 其中命令是 npm install save 什么是 save选项是什么意思 更新 npm 5 As of npm 5 0 0 http blog npmjs org post 161081169345 v500 安装的模块
  • lessc:未找到命令

    我使用的是 OS X 8 并且是 Node LESS 的新手 我以为我之前安装了 lessc 当我转到 usr local bin 时 我看到了 lessc 但对于我的生活来说 我无法运行它 每当我运行它时 我都会看到 bash lessc
  • Windows 10 中的 npm 安装错误( npm install -g angular-cli )

    node v v4 5 0 npm v 5 0 1 有人在 Windows 10 中安装 angular cli 时遇到过这种问题吗 请尝试以下操作 step 0 运行这个命令 npm uninstall g angular cli npm
  • keystonejs 模型中的动态类型选择

    我想在 adminUI 中使用一个组合框 其中包含来自 Web 服务的字段 我正在考虑使用预 查找 挂钩获取数据 然后覆盖模式中 受众 属性的选项属性 Schema Compliance add title type Types Text
  • 使用 mosca MQTT 的请求响应模式

    有没有办法使用 mosca MQTT 实现请求响应模式 以 检查客户端的回复 如果在预期时间内未收到预期回复 则重新发布 我相信这在 Mqtt 5 中是可能的 但截至目前 我必须使用 QoS 1 的 Mosca 代理 支持直到 Mqtt 3
  • (节点:20732)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。未来在nodejs中

    我正在尝试在我的应用程序中生成确认链接 虽然它工作正常并且也生成链接 但是当我访问该链接时 它在 Chrome 控制台中显示 POST http localhost 3000 api auth confirmation 400 Bad Re
  • TypeError [ERR_INVALID_ARG_TYPE]:“listener”参数必须是 Function 类型

    我这里有一个小问题 events js 200抛出新错误 ERR INVALID ARG TYPE listener Function listener 类型错误 ERR INVALID ARG TYPE 侦听器 参数必须是类型 功能 收到
  • Heroku ENOENT:没有这样的文件或目录,stat '/app/build/index.html'

    我在 Heroku 中运行一个简单的测试站点时遇到问题 由于某种原因 当我希望它从 build 提供服务时 它试图从 app build 提供内容 错误 ENOENT 没有这样的文件或目录 stat app build index html
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • IE8 和 9 上的 socket.io 问题

    Socket io 在除 IE8 和 9 之外的所有平台上都能完美运行 这是客户端要求 你们能帮忙解决这个问题吗 我一直在阅读所有类似的问题 但到目前为止我发现的大多数解决方案都无法解决 IE8 上的这个问题 这是结构 服务器端 var i

随机推荐

  • .NET 中的“美国东部标准时间”与“东部标准时间”

    在列出所有Id的属性TimeZoneInfos 返回者TimeZoneInfo GetSystemTimeZones 出现两个版本的 EST 美国东部标准时间和东部标准时间 有什么不同 我还看到美国山地标准时间和山地标准时间 但我很确定这是
  • JDBC 程序中的 java.lang.ClassNotFoundException [重复]

    这个问题在这里已经有答案了 我正在 java SE 7 中制作一个简单的 JDBC 程序 但在编译程序后 它给出了 java lang ClassNotFoundException org postgreasql Driver 错误 我按照
  • Delphi快速加大整数?

    function AddNumStrings Str1 Str2 string string var i integer carryStr string worker integer workerStr s string begin Res
  • 如何使用同一个工人让芹菜重试?

    我刚刚开始在 Django 项目中使用 celery 并且有点陷入这个特定问题 基本上 我需要将长期运行的任务分发给不同的工作人员 该任务实际上分为几个步骤 每个步骤都需要相当长的时间才能完成 因此 如果某个步骤失败 我希望 celery
  • mclapply 与大对象 - “序列化太大,无法存储在原始向量中”

    我一直遇到一个问题multicore包裹和大物体 基本思想是我使用 Bioconductor 函数 readBamGappedAlignments 读取大对象 我有一个文件名的字符向量 并且我一直在使用mclapply循环遍历文件并将它们读
  • iOS7 中旋转后 UITextview 文本不显示顶行

    我有一个包含显示静态文本的 UITextview 的应用程序 我使用 UITextview 来滚动文本 该文本比 UILabel 中可以显示的长得多 由于某种原因 iOS 7 下 UITextview 中的文本在旋转后不会保持滚动到顶部 在
  • Django /subdirectory/admin/ 重定向到 /admin/login/?next=/admin/

    我在端口 8011 上设置了一个 Django 服务器 并让 nginx 将其作为端口 80 上的子目录 静态文件 很好 页数 不错 但是当我访问 subdirectory admin 时 它需要我 admin login next adm
  • 是什么限制了我的 PHP 资源?

    我在从 PHP 中获取更多内存时遇到问题 这是错误消息 Fatal error Allowed memory size of 20971520 bytes exhausted tried to allocate 82 bytes in Ye
  • 存储大量数据的最智能方式

    我想通过 REST 请求访问 flickr API 并下载大约的元数据 1 张 Mio 照片 也许更多 我想将它们存储在 csv 文件中 然后将它们导入 MySQL 数据库以进行进一步处理 我想知道处理如此大数据的最明智的方法是什么 我不确
  • 在 fancybox 中加载图像 150% 的大小

    我只是创建一个愚蠢的 GIF 画廊 其中显示一个缩略图 单击时相关的 GIF 将被加载并显示在一个 fancybox 中 我的 fancybox 的代码是这样的 fancyGIF fancybox arrows false openEffe
  • XML 元素和命名空间

    我有以下方法来解析 XMLElements DisplayMessages XElement root var items root Descendants Item foreach var item in items var name i
  • D 中的模板参数推理

    我正在编写一些对静态 D 数组进行操作的向量函数 如下所示 real N unit uint N real N v real N u v norm v explicit type necessary to force slice opera
  • iOS 即席分发

    我目前已经完成了 iOS 应用程序的制作 我想使用临时分发方式在我的同事之间分发该应用程序 我只有两个月的 XCode 经验 对于向同事发送应用程序需要哪些材料 我感到很困惑 我不想犯下无法挽回的错误 为了将应用程序分发给其他人 我需要捆绑
  • pdf生成后如何打开打印对话框?

    我编写了一些动态生成 PDF 文件的操作 类似 reports reportGenerator action 当我打电话时reports reportGenerator param dialy它将在弹出窗口中打开生成的 pdf 然后我可以按
  • 我可以向同一台服务器发出 CURL 请求吗?

    我需要实现一种方法来对位于同一服务器或另一服务器上的页面进行 POST 调用 我们不能使用 include 因为我们调用的文件通常调用不同的数据库或具有相同名称的函数 我一直在尝试使用curl 来实现这一点 虽然它在从另一台服务器调用文件时
  • 跟踪文件但将其从 git 包中排除

    我有一个有点复杂的 ansible 工作流程 我有两个气隙网络 我在两个网络上开发剧本 所以我有两个由 git 管理的有点独立的 ansible 存储库 同时 大多数剧本都可以在这两个地方使用 使事情复杂化的是 这是一种单向转移 我可以从网
  • Jquery animate() 和 google chrome 问题

    我在 google Chrome 中遇到 jquery 和 animate 问题 我有一个最初隐藏的盒子 位于屏幕的右侧 当单击一个框时 隐藏的框变得可见并从右到中心动画 它停止并闪烁 然后它开始再次移动到屏幕的左侧并消失 这个东西适用于
  • 从 WebForm 使用 MVC HtmlHelper

    我正在向混合 WebForms MVC 站点添加一些 UI 功能 在本例中 我将一些 AJAX UI 功能添加到 WebForms 页面 通过 jQuery 并且数据来自 MVC JsonResult 一切都 100 正常工作 但有一个例外
  • Homestead 2 xdebug 不起作用

    我有一个 Homestead vagrant VM 设置 Xdebug 是开箱即用的远程调试的所有设置 我可以在这里看到这个 etc php5 fpm conf d 20 xdebug ini 并通过做一个php i grep xdebug
  • 在 Q 中链接任意数量的 Promise

    我想发送 N 次 HTTP 请求 我希望最终获得有关每个请求的结果的信息 运行一次请求函数效果很好 这是使用 Q defer 的 HTTP 请求函数 function runRequest var deferred Q defer star