V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
s609926202
V2EX  ›  Node.js

Nodejs 如何并发请求数据接口,并返回汇总后的结果?

  •  
  •   s609926202 · 2020-08-20 10:25:21 +08:00 · 2863 次点击
    这是一个创建于 1346 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 Nodejs 写了一个 API 接口,用于请求指定数据。这个接口会请求三个其他的 API:

    1. http://a.com/api1
    2. http://b.com/api2
    3. http://c.com/api3

    我的目的是同时(并发)请求上面这三个 API,然后汇总请求到的结果,返回给客户端。
    请问这个可以实现吗,对 Nodejs 不懂?

    11 条回复    2020-09-21 11:52:45 +08:00
    hgjian
        1
    hgjian  
       2020-08-20 10:26:55 +08:00 via Android
    promise.all ?好像可以
    flowfire
        2
    flowfire  
       2020-08-20 10:31:09 +08:00   ❤️ 1
    await Promise.all([
    fetch("url1"),
    fetch("url2"),
    fetch("url3"),
    ])
    c6h6benzene
        3
    c6h6benzene  
       2020-08-20 10:39:13 +08:00 via iPhone
    如果用包装好的包如 axios,可以用 axios.all([request1, request2, request3,...).then(axios.spread(response1, response2, response3) => {})。
    coderxy
        4
    coderxy  
       2020-08-20 11:00:26 +08:00
    promise.all
    4196
        5
    4196  
       2020-08-20 11:24:26 +08:00
    不是 Nodejs 不懂的问题,你应该多去学下 js,特别是 es6+的😄
    galikeoy
        6
    galikeoy  
       2020-08-20 12:42:42 +08:00
    1.回调嵌套
    2.请求成功计数
    3.promise.all
    buffzty
        7
    buffzty  
       2020-08-20 15:48:46 +08:00
    async ()=>{
    const task1 = fetch1()
    const task2 = fetch2()
    const task3 = fetch3()
    // try catch
    const task1Resp = await task1
    const task2Resp = await task2
    const task3Resp = await task3
    // logic
    }
    azcvcza
        8
    azcvcza  
       2020-08-20 15:58:17 +08:00   ❤️ 1
    promise.all 建议里边包一层 promise,这样即使请求错误 promise.all 也不会挂掉往下走了
    evilStart
        9
    evilStart  
       2020-08-20 22:08:16 +08:00 via Android
    @azcvcza promise.allSettled 可解
    azcvcza
        10
    azcvcza  
       2020-08-21 14:06:45 +08:00
    @evilStart 估计也是 promise.all 里包一层 promise 的语法糖
    JaydenC
        11
    JaydenC  
       2020-09-21 11:52:45 +08:00
    用这个就好了,总有你想要的流程控制方式
    https://caolan.github.io/async/v3/docs.html#parallel



    async.parallel([
    function(callback) {
    setTimeout(function() {
    callback(null, 'one');
    }, 200);
    },
    function(callback) {
    setTimeout(function() {
    callback(null, 'two');
    }, 100);
    }
    ],
    // optional callback
    function(err, results) {
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
    });

    // an example using an object instead of an array
    async.parallel({
    one: function(callback) {
    setTimeout(function() {
    callback(null, 1);
    }, 200);
    },
    two: function(callback) {
    setTimeout(function() {
    callback(null, 2);
    }, 100);
    }
    }, function(err, results) {
    // results is now equals to: {one: 1, two: 2} 这里执行所有请求返回后的回调
    });
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2996 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:01 · PVG 22:01 · LAX 07:01 · JFK 10:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.