当前位置: 首页 > 面试题库 >

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

郭辉
2023-03-14
问题内容

在我的NodeJS代码中,我需要进行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

  });

});

我知道您也可以通过promise做一些类似的事情,但我认为相同的概念适用于下一个调用要等到当前调用完成后才能执行的情况。

有没有一种方法可以同时调用所有函数,但是对于我的最后一段代码,要等待所有API调用完成并提供数据,然后再执行?


问题答案:

承诺会给您Promise.all()(对于本地承诺以及诸如bluebird的库承诺都是如此)。

更新 :从节点8开始,您可以util.promisify()像使用Bluebird一样使用.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
});

因此,您可以做什么(本机):

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

如果您有蓝鸟,这甚至更简单:

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


 类似资料:
  • 问题内容: 总的来说,我对Swift和Xcode还是比较陌生,并且发现很多困难要设法解决。 我正在开发一个利用后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,它都会异步地在其他线程上完成。但是,其余代码将继续在主线程上执行,并且当应该从服务器下载的数据尚未下载时,它将崩溃。我想知道如何在异步函数完成后调用函数来运行,这对于单独文件中的函数必须完成。 我读过闭包可能对此有

  • 问题内容: 我试图创建一个可以异步运行多个进程并发送响应的函数。由于不返回响应,因此我想创建一个函数为: 在此函数中,我异步调用,它接受的其他参数。由于列表是作为参考传递的,所以我认为我可以在列表中附加实际功能的响应。和将返回我所有的功能的响应。 但这并不符合我的预期。值会附加到中的,但工作人员列表外部仍为空。 知道我在做什么错吗?而且,有没有其他选择可以实现我的目标? 问题答案: 您不能直接在流

  • 我试图从两个不同的API中获取数据,并希望这在parallell中发生,但我希望等待它们执行,然后继续下一行代码。

  • 问题内容: 在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。 我在需要访问和解析结果的URI数组上使用标准构造。 码: 我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与看起来很hacky 的次数相同时才继续。 所以我的问题是, 在node.js中处理这种情况的最佳方法 是

  • 问题内容: 假设我有这段代码 我想知道的是该函数是否将异步执行。 问题答案: 设完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。 如果完成是突然完成,则 令status为Call(resolvevingFunctions。[[Reject]],undefined,«completion。

  • 通过使用 Web Worker 在单独的线程中运行一个函数,允许长时间运行的函数不会阻塞 UI。 使用 Blob 对象URL创建一个新的Worker,其内容应该是所提供函数的字符串化版本。 立即发送回调用函数的返回值。 返回一个 promise ,监听 onmessage 和 onerror 事件并解析 worker 发回的数据,或者抛出一个错误。 const runAsync = fn => {