javascript асинхронный цикл forEach - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь запуститьasticsearch для массива значений (индексов), и я столкнулся с проблемой асинхронности javaScript:

function(indices) {
  let results = [];

  indices.forEach(d => ESClient.search({
      index: d.indexName,
      body: {
        query: {
          match: {
            first_name: 'fred'
          }
        }
      }
    })
    .then(resp => results.push(resp))
  )
}

В индексах должно быть три элемента, как мне возвращать результаты со всеми тремя ответами из моего поиска?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Выезд Promise.all

search(indices) {
  return Promise.all(
    indices.map((d) => {
      return ESClient.search(yourElasticSearchPayload)
    })
  );
}

--------------------------------------------------------------------------

this.search(indices).then((results) => {
  // do something with results
}).catch((reason) => { 
  // failure-reason of the first failed request
  console.log(reason);
});
0 голосов
/ 06 сентября 2018

В вашем случае вы можете использовать map и Promise.all. Если на карте создается массив Обещаний для этих индексов, Promise.all ждет, пока эти Обещания будут разрешены, и возвращает массив с их разрешенными значениями.

function(indices) {
  let results = Promise.all(indices.map(d => ESClient.search({
    index: d.indexName,
    body: {
      query: {
        match: {
          first_name: 'fred'
        }
      }
    }
  })))
}

Но это не так читабельно, поэтому я бы переместил обратный вызов отображения в собственную функцию:

function searchForIndex(d) {
  return ESClient.search({
    index: d.indexName,
    body: {
      query: {
        match: {
          first_name: 'fred'
        }
      }
    }
  })
}

function(indices) {
  let results = Promise.all(indices.map(searchForIndex))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...