Как я могу вернуть новое обещание от функции с локальными значениями, передаваемыми в качестве параметров? - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу вернуть обещание.all () с переменной источника, локально определенной ниже, чтобы я мог использовать обещание при вызове sourceRequest.then ((sources) => {// сделать что-то}) вот мой код:

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)});

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Вы ничего не возвращаете из sourceRequest, поэтому он возвращает undefined, а не обещание.

Хотя вы можете это исправить, вернув Promise.all:

return Promise.all(promisesCollection).then(() => {

Было бы более элегантно избегать использования явного антипаттерна Promise . Сопоставьте ответы с их .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 l oop:

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);
0 голосов
/ 11 апреля 2020

Тогда вам просто нужен шаг, который заменяет список ответов списком источников.

const promisedSources = Promise.all(promisesCollection)
                          .then(responses => 
                              responses.map(response => response.data.sources)
                          );
return promisesSources;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...