首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何运行多个异步函数然后执行回调?

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

Stack Overflow用户
提问于 2015-09-29 01:14:20
回答 3查看 42.5K关注 0票数 31

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

我知道如何使用API回调(下一次调用将发生在前一个调用的回调中),但这会很慢:

代码语言:javascript
复制
//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

  });

});

我知道你也可以用promises做一些类似的、更整洁的事情,但我认为同样的概念也适用于下一个调用直到当前调用结束才会执行的情况。

有没有一种方法可以同时调用所有函数,而不是让我的最后一段代码等待所有API调用完成并在执行之前提供数据?

EN

回答 3

Stack Overflow用户

发布于 2015-09-29 07:03:45

如果你想使用异步的话,听起来async.parallel()也可以做这件事:

代码语言:javascript
复制
var async = require('async');

async.parallel({
    one: function(parallelCb) {
        request('http://www.example1.com', function (err, res, body) {
            parallelCb(null, {err: err, res: res, body: body});
        });
    },
    two: function(parallelCb) {
        request('http://www.example2.com', function (err, res, body) {
            parallelCb(null, {err: err, res: res, body: body});
        });
    },
    three: function(parallelCb) {
        request('http://www.example3.com', function (err, res, body) {
            parallelCb(null, {err: err, res: res, body: body});
        });
    }
}, function(err, results) {
    // results will have the results of all 3
    console.log(results.one);
    console.log(results.two);
    console.log(results.three);
});
票数 13
EN

Stack Overflow用户

发布于 2017-07-01 03:16:08

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

ES6现在包含了Promise.all,所以你根本不需要任何第三方的库。

"Promise.all等待所有完成(或第一次拒绝)“

我在https://gist.github.com/rainabba/21bf3b741c6f9857d741b69ba8ad78b1上设置了一个要点,用重构迭代来演示Promise.all()

我使用的是一个IIFE (立即调用的函数表达式)。如果你不熟悉,你会想要看下面的例子,尽管要点展示了如何使用IIFE。https://en.wikipedia.org/wiki/Immediately-invoked_function_expression

TL;DR

代码语言:javascript
复制
( function( promises ){
    return new Promise( ( resolve, reject ) => {
        Promise.all( promises )
            .then( values => {
                console.log("resolved all promises")
                console.dir( values );
                resolve( values.reduce( (sum,value) => { return sum+value }) ); //Use Array.prototype.reduce() to sum the values in the array
            })
            .catch( err => {
                console.dir( err );
                throw err;
            });

    });
})([ 
    new Promise( ( resolve, reject ) => {
        console.log("resolving 1");
        resolve( 1 );
    }),
    new Promise( ( resolve, reject ) => {
        console.log("resolving 2");
        resolve( 2 );
    })
 ]).then( sum => { console.dir( { sum: sum } ) } )
票数 3
EN

Stack Overflow用户

发布于 2021-05-19 20:23:24

我有一个类似的用例,我必须做10个并发调用。我是用async/awaitPromise.all的组合来实现的。

代码语言:javascript
复制
async function getData() {
  try {
    let result = null
    const ids = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

    let promises = ids.map(async (id) => {
        return fetch(
          `https://jsonplaceholder.typicode.com/todos/${id}`
        ).then((data) => data.json());
      });
    
    result = await Promise.all(promises)
    return result
  } catch(err) {
    console.log("error: ", err)
  }
}

getData().then(data => console.log(data))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32828415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档