在返回数据之前等待所有并行异步函数完成的最佳方法是什么?
请求异步工作,以下函数将返回一个空数组。
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/