我试图编写一个返回Elasticsearch v5查询结果的JavaScript函数。我无法弄清楚在哪里以及如何包含' return'在这段代码中。通过以下内容,segmentSearch(id)返回一个Promise对象{_45: 0, _81: 0, _65: null, _54: null}
。
_65包含正确命中的数组,但我无法弄清楚如何解析它。 console.log(hits)生成相同的数组,但是如何从函数中返回它?
var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({
host: 'localhost:9200',
log: 'trace'
});
segmentSearch = function(id){
var searchParams = {
index: 'myIndex',
type: 'segment',
body: {
query: {
nested : {
path : "properties",
query : {
match : {"properties.source" : id }
},
inner_hits : {}
}
}
}
}
return client.search(searchParams).then(function (resp) {
var hits = resp.hits.hits;
console.log('hits: ',hits)
return hits;
}, function (err) {
console.trace(err.message);
});
}
答案 0 :(得分:1)
我会在你的client.search函数之外的全局范围和阵列中实现一个新数组。赶快你的命中'然后访问新填充的数组。
let newArr = []; client.search(searchParams).then(function (resp) { for(let i = 0; i < resp.hits.hits.length; i++){ newArr.push(resp.hits.hits[i]); } console.log('hits: ',newArr) return newArr; }, function (err) { console.trace(err.message); });
答案 1 :(得分:0)
首先,elasticsearch js客户端正在使用Promise(我认为使用回调也是可能的)。
使用Promise是处理异步计算的好方法。
在你的问题中,你已经做了一些承诺:
var search = function(id)
{
var searchParams = { /** What your search is **/}
return client.search(searchParams)
}
此调用正在返回Promise。 如果我们将handleResponse视为您当时的函数
var handleResponse = function(resp)
{
var hits = resp.hits.hits;
console.log('hits: ',hits)
return hits; //You could send back result here if using node
}
在你的代码中,一旦promise为fullfield,就会调用handleResponse。在该代码中,您正在处理数据。不要忘记你处于异步状态,你需要继续努力处理命中。
顺便说一句,在你的问题中,你通过使用&#34;然后&#34;做了什么。是链接承诺。承诺是正常的。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then Promise.prototype.then正在返回一个Promise。
var segmentSearch = function ( id )
{
return search
.then( handleResponse //here you got your hit )
.then( function ( hits )
{
console.log(hits) //and here you have done something with hits from search.
})
}
答案 2 :(得分:0)
我忽略了发布我的修复,抱歉。顺序是创建searchParams,执行client.search(searchParams),返回命中的Promise,然后处理这些命中:
segmentSearch = function(obj){
// retrieve all segments associated with a place,
// populate results <div>
let html = ''
var plKeys = Object.keys(obj)
var relevantProjects = []
for(let i = 0; i < plKeys.length; i++){
relevantProjects.push(obj[plKeys[i]][0])
var searchParams = {
index: 'myIndex',
type: 'segment',
body: {
query: {
nested : {
path : "properties",
query : {
match : {"properties.source" : id }
},
inner_hits : {}
}
}
}
}
client.search(searchParams).then(function (resp) {
return Promise.all(resp.hits.hits)
}).then(function(hitsArray){
...write html to a <div> using hits results
}
}