如何运行多个异步函数然后执行回调?

2024-02-24

在我的 Node.js 代码中,我需要进行 2 或 3 个 API 调用,每个调用都会返回一些数据。所有 API 调用完成后,我想将所有数据收集到一个 JSON 对象中以发送到前端。

我知道如何使用 API 回调来执行此操作(下一个调用将在上一个调用的回调中发生),但这会很慢:

//1st request
request('http://www.example.com', function (err1, res1, body) {
  
  //2nd request
  request('http://www.example2.com', function (err2, res2, body2) {
  
    //combine data and do something with it

  });

});

我知道你也可以用承诺做一些类似和更简洁的事情,但我认为同样的概念适用于下一个调用在当前调用完成之前不会执行的情况。

有没有办法同时调用所有函数,但我的最后一个代码块要等待所有 API 调用完成并在执行之前提供数据?


承诺给你Promise.all()(对于本机 Promise 以及像 Bluebird 这样的库 Promise 来说都是如此)。

Update:从 Node 8 开始,您可以使用util.promisify()就像你对蓝鸟的那样.promisify()

var requestAsync = util.promisify(request); // const util = require('util')
var urls = ['url1', 'url2'];
Promise.all(urls.map(requestAsync)).then(allData => {
    // All data available here in the order of the elements in the array
});

So what you can do (native):

function requestAsync(url) {
    return new Promise(function(resolve, reject) {
        request(url, function(err, res, body) {
            if (err) { return reject(err); }
            return resolve([res, body]);
        });
    });
}
Promise.all([requestAsync('url1'), requestAsync('url2')])
    .then(function(allData) {
        // All data available here in the order it was called.
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何运行多个异步函数然后执行回调? 的相关文章

随机推荐

  • 有没有 Android 视图生命周期的图形表示(状态图)? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们都知道AndroidActivity的生命周期 http developer android com
  • C 中标量类型和聚合类型有什么区别?

    我读过一本书 叫 Pointers On C 在那本书中 有一种类型称为标量类型 我知道算术类型和指针类型统称为标量类型 但我想知道标量类型和聚合类型有什么区别以及什么场合使用它们 C11 6 2 5 类型 p21 Arithmetic t
  • 禁用 UITextField 的简单方法?

    有没有一种简单的方法来禁用UITextField在代码中 我的应用程序有 12 个UITextField默认情况下都是打开的 但是当我的段控制中检测到更改时 我想禁用一些UITextField取决于用户选择的细分 只需知道如何禁用它或使其不
  • Flutter:没有为该类型定义 getter

    我被页面路由困住了 这是 main dart 中的代码 import package test routes router gr dart import package flutter material dart import packag
  • 删除 Android 导航和顶部栏,

    我正在尝试在已取得 root 权限的 Android 设备上实现 Kiosk 应用程序 并且我需要完全禁用导航和状态栏 这些命令在 adb shell 中工作 禁用 service call activity 42 s16 com andr
  • 获取android中已安装的应用程序列表

    我正在尝试为 Android 开发一个应用程序启动器应用程序 我刚开始 但这里有一个问题 如何获取 Android 中所有已安装应用程序的列表 在您的活动中使用这些方法来获取已安装应用程序的列表 private ArrayList
  • 为什么 JavaScript: new Date(year, Month, 0).getDate() 返回该月的天数?

    我知道这个小小的 JavaScript 代码 var whatever new Date year month 0 getDate 返回特定年份的特定月份的天数 但我似乎不明白其背后的逻辑 在我们提到年份和月份之后 那个零到底在做什么 请解
  • Ruby on Rails 移动应用程序

    我正在尝试开发一个 Ruby on Rails 应用程序 它将检测客户端 即连接到服务器的移动设备 浏览器 并呈现适当的布局 我尝试使用以下链接 但仍然无法连接 有什么建议 http www arctickiwi com blog mobi
  • 我如何在 spring security acl 中检查我的对象权限而不是使用 hasPermission 注释

    有没有办法直接从我的代码检查我的类对象权限 而不是使用注释模型 PostAuthorize hasPermission returnObject WRITE public BaseData getSingle Long id 假设您打算使用
  • CLOB 中是否保留转义序列?

    我们使用Java和Oracle进行开发 我在 Oracle 数据库中有一个表 其中有一个 CLOB 列 某些 XYZ 应用程序会在此列中转储文本文件 文本文件有多行 通过 Java 应用程序读取相同的 CLOB 文件时 转义序列 换行符等
  • 创建视图实例时 Backbone.js 不是构造函数错误

    我是backbone js 的新用户 正在测试如何使用它 最近几天我正在测试如何使用路由通过集合更改视图数据 在当前情况下 我遇到了一个问题 当我尝试在 router js 中创建 ScheduleView 实例时 控制台会记录以下错误消息
  • 为什么 Docker 服务停止了?

    我将 Ubuntu 作为 Windows 10 上的子系统运行 我刚刚按照以下步骤在 Linux 上安装 Docker https docs docker com install linux docker ce ubuntu https d
  • Cucumber 运行程序类的 Intellij IDEA 运行配置

    我是 Intellij IDEA 的新手 我有一个基于 POM 的 cucumber selenium 项目 我在其中为每个功能文件创建了 cucumber runner 类 在使用 Eclipse 时 我能够通过右键单击来执行这些运行程序
  • MySQL Git Bash winpty mysqldump stdout 不是 tty 并且 stdin 不是 tty

    请帮助使用 MySQL Git Bash winpty mysqldump winpty mysqldump 在 Git Bash 中不起作用 这里是错误的详细信息 Git Bash winpty mysqldump u root p em
  • Python for 循环变慢并最终挂起

    我对 Python 完全陌生 截至半小时前 并尝试编写一个简单的脚本来枚举 SMTP 服务器上的用户 用户文件是一个简单的用户名列表 每行一个 该脚本运行良好 但随着循环的每次迭代 它都会变慢 直到循环 14 左右 它似乎完全挂起 没有错误
  • 使用Python(smtplib)发送邮件时指定发件人

    我有一段非常简单的代码 仅用于测试 import smtplib import time server smtp myprovider com recipients email protected cdn cgi l email prote
  • 如果使用 == 的语句给出了意外的结果[重复]

    这个问题在这里已经有答案了 private void refineWords for String word words Log i word word if word s word t word am word is word are w
  • 抽象工厂、工厂方法、构建器

    看起来这个问题似乎是一个骗局 但请耐心等待 我保证我已经阅读了相关帖子 以及GOF book https rads stackoverflow com amzn click com 0201633612 在读完所有内容后 我仍然不清楚何时使
  • node.js socket.io 如何发送到特定客户端?

    我想向特定客户端 发出 一条消息 该消息是根据不同客户端中收到的另一条消息而选择的 我该如何执行此操作 我正在考虑将每个客户加入他们自己的 房间 然后进行广播 有没有更好的办法 socket io 1 0 及以上版本的更新 io to so
  • 如何运行多个异步函数然后执行回调?

    在我的 Node js 代码中 我需要进行 2 或 3 个 API 调用 每个调用都会返回一些数据 所有 API 调用完成后 我想将所有数据收集到一个 JSON 对象中以发送到前端 我知道如何使用 API 回调来执行此操作 下一个调用将在上