javascript - 返回数据之前等待异步函数完成的最佳方法

标签 javascript arrays asynchronous request promise

在返回数据之前等待所有并行异步函数完成的最佳方法是什么?

请求异步工作,以下函数将返回一个空数组。

import request from 'request'

// List of urls
const urls = [
  'http://someurl.com/1.json',
  'http://someurl.com/2.json',
  'http://someurl.com/3.json',
]

function getData () {
  // An array that will contain data
  let result = []
  
  // Request data from all urls
  urls.forEach(i => {
    // Function works asynchronously
    request(i, (err, res, body) => {
      if(err) throw err
      
      const data = JSON.parse(body)
      
      result.push(i.someValue)
    })
  })

  return result // Returns an empty array :(
}

最佳答案

如果你可以使用 Promise,最好的方法就是使用它们。 确保您的请求函数返回一个 promise ,这样您就可以执行以下操作:

var request = function request( url ) {
    return new Promise(function requestPromise( resolve, reject ) {
        myAjaxCallOrOtherAsyncCall( url, function( error, response ) {
            if (error) reject(error);
            else resolve(response);
        })
    });
};

var getData = function getData( urls ) {
    return Promise.all( urls.map(request) );
};

var urls = [
  'http://someurl.com/1.json',
  'http://someurl.com/2.json',
  'http://someurl.com/3.json',
];

getData(urls).then(function( responses ) {
    var results = responses.map(JSON.parse);
    // do somethign with async results
});

关于javascript - 返回数据之前等待异步函数完成的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783390/

相关文章:

javascript - x+=y+=z 在 Javascript 中

php - 如何从视频中提取图像以将其用作缩略图

c - 在 C 中动态填充字符串数组

c# - SemaphoreSlim.WaitAsync 如何允许异步函数的顺序执行?

c# - 如何在异步方法中调用 EndInvoke

javascript - 访问 JSON 对象中的父节点

javascript - 输入焦点或按下 tab 键,移动到屏幕中心

java - 计算数组中的重复值

arrays - 通过哈希转换字符串

javascript - 异步过滤 Promise 数组