我试图在一组值(索引)上运行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))
)
}
索引中应该包含三个元素,如何在搜索到的所有三个响应中返回结果?
答案 0 :(得分:0)
在这种情况下,您可以使用map
和Promise.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)
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);
});