我想返回带有本地定义的sources变量的promise.all(),所以当我调用sourceRequest.then((sources)=> {//做某事}时,我可以使用promise这是我的代码:
var sourceRequest=(...countries)=>{
var sources=[];
var promisesCollection=[];
for(var country of countries)
{
var promise=this._vm.$axios.get('/sources',{params:{ country,language:'en'}})
.then(response=>{
sources.push(response.data.sources);
});
promisesCollection.push(promise);
}
Promise.all(promisesCollection).then(()=>{
return new Promise((resolve)=>resolve(sources));
})
};
sourceRequest('in').then((sources)=>console.log(sources));
问题是我在控制台中未定义解决方法:我对此有一种解决方法,但是问题是我希望函数返回源而不是api请求响应:
//this works
var sourceRequest=(...countries)=>{
var promisesCollection=[];
for(var country of countries)
{
var promise=this._vm.$axios.get('/sources',{params:{ country,language:'en'}})
promisesCollection.push(promise);
}
return Promise.all(promisesCollection);
};
sourceRequest('in').then((response)=>{console.log(response)});
然后,您只需要一个步骤即可替换响应列表和来源列表。
const promisedSources = Promise.all(promisesCollection)
.then(responses =>
responses.map(response => response.data.sources)
);
return promisesSources;
您没有从sourceRequest
返回任何内容,因此它返回undefined
,而不是Promise。
虽然您可以通过返回Promise.all
来修复它:
return Promise.all(promisesCollection).then(() => {
也最好避免使用explicit Promise construction antipattern。将响应映射到他们的.data.sources
:
const sourceRequest = (...countries) => {
const promisesCollection = [];
for (const country of countries) {
promisesCollection.push(this._vm.$axios.get('/sources', {
params: {
country,
language: 'en'
}
}));
}
return Promise.all(promisesCollection).then(
responsesArr => responsesArr.map(response => response.data.sources)
);
};
sourceRequest('in').then(console.log);
或者,使用.map
单独,而不是for
循环:
const sourceRequest = (...countries) => {
return Promise.all(countries.map(country => (
this._vm.$axios.get('/sources', {
params: {
country,
language: 'en'
}
})
.then(response => response.data.sources))
));
};
sourceRequest('in').then(console.log);