我如何从以局部值作为参数传递的函数中返回新的承诺?

问题描述 投票:0回答:2

我想返回带有本地定义的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)});
javascript promise
2个回答
0
投票

然后,您只需要一个步骤即可替换响应列表和来源列表。

const promisedSources = Promise.all(promisesCollection)
                          .then(responses => 
                              responses.map(response => response.data.sources)
                          );
return promisesSources;

0
投票

您没有从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);
© www.soinside.com 2019 - 2024. All rights reserved.