Javascript 在返回数据之前等待异步函数完成的最佳方法
在返回数据之前,等待所有并行异步函数完成的最佳方式是什么 请求异步工作,下面的函数将返回一个空数组Javascript 在返回数据之前等待异步函数完成的最佳方法,javascript,arrays,asynchronous,request,promise,Javascript,Arrays,Asynchronous,Request,Promise,在返回数据之前,等待所有并行异步函数完成的最佳方式是什么 请求异步工作,下面的函数将返回一个空数组 从“请求”导入请求 //URL列表 常量URL=[ 'http://someurl.com/1.json', 'http://someurl.com/2.json', 'http://someurl.com/3.json', ] 函数getData(){ //将包含数据的数组 让结果=[] //从所有URL请求数据 forEach(i=>{ //函数异步工作 请求(i,(err,res,body
从“请求”导入请求
//URL列表
常量URL=[
'http://someurl.com/1.json',
'http://someurl.com/2.json',
'http://someurl.com/3.json',
]
函数getData(){
//将包含数据的数组
让结果=[]
//从所有URL请求数据
forEach(i=>{
//函数异步工作
请求(i,(err,res,body)=>{
如果(错误)抛出错误
const data=JSON.parse(正文)
结果。推送(i.someValue)
})
})
返回结果//返回一个空数组:(
}
如果你能使用承诺,最好的方法就是使用它们。
确保您的请求函数返回一个承诺,这样您就可以执行如下操作:
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
});
如果你能使用承诺,最好的方法就是使用它们。 确保您的请求函数返回一个承诺,这样您就可以执行如下操作:
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
});
使用Promise.all()
等待所有承诺完成,尽管这确实需要使用一个返回承诺的请求库,如
使用Promise.all()
等待所有承诺完成,尽管这确实需要使用一个返回承诺的请求库,如
尝试使用触发器。收集所有数据后,使用
$(trigger_obj).trigger('loading_complete');
然后把它变成一个处理器
$(trigger_obj).on('loading_complete', function () {
\\ logic ...
});
尝试使用触发器。收集所有数据后,使用
$(trigger_obj).trigger('loading_complete');
然后把它变成一个处理器
$(trigger_obj).on('loading_complete', function () {
\\ logic ...
});
使用,您可以促进承诺。正如其他人已经指出的那样:
import Request from 'request-promise-native'
// List of urls
const urls = [
'http://someurl.com/1.json',
'http://someurl.com/2.json',
'http://someurl.com/3.json',
]
// The simplest form to create a bunch of request promises:
Promise.all(urls.map(Request))
// Otherwise it could look as follows:
const urlPromises = urls.map(url => Request({
uri: 'http://www.google.com'
// and more options
}))
// Or with promise chains:
const urlPromiseChain = (url) => {
return Request(url)
.then(doSomethingWithResponse)
.catch(logButDontFailOnError)
}
const urlPromiseChains = urls.map(urlPromiseChain)
Promise.all(urlPromises /* or urlPromiseChains */)
.then(responses => console.log(responses))
使用,您可以促进承诺。正如其他人已经指出的那样:
import Request from 'request-promise-native'
// List of urls
const urls = [
'http://someurl.com/1.json',
'http://someurl.com/2.json',
'http://someurl.com/3.json',
]
// The simplest form to create a bunch of request promises:
Promise.all(urls.map(Request))
// Otherwise it could look as follows:
const urlPromises = urls.map(url => Request({
uri: 'http://www.google.com'
// and more options
}))
// Or with promise chains:
const urlPromiseChain = (url) => {
return Request(url)
.then(doSomethingWithResponse)
.catch(logButDontFailOnError)
}
const urlPromiseChains = urls.map(urlPromiseChain)
Promise.all(urlPromises /* or urlPromiseChains */)
.then(responses => console.log(responses))
Promise.all()sense@Aronhttps://www.npmjs.com/package/request
@Aron My bad.对不起,修复后首先,您不能等待异步响应完成后再返回。有关该问题的所有详细信息,请参阅。Promise.all()
您使用的是什么请求库?从“require”导入请求
不做任何更改sense@Aronhttps://www.npmjs.com/package/request
@Aron My bad.对不起,修复后首先,您不能等待异步响应完成后再返回。有关该问题的所有详细信息,请参阅。这与多个同步调用?这与多个异步调用有什么关系?