JavaScript异步forEach循环

时间:2018-09-06 08:00:59

标签: javascript elasticsearch asynchronous foreach

我试图在一组值(索引)上运行elasticsearch,但遇到了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 :(得分:0)

在这种情况下,您可以使用mapPromise.all。您在地图上为这些索引创建了一个Promises数组,Promise.all会等到这些Promises被解析后再返回包含其解析值的数组。

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

答案 1 :(得分:0)

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