2016-11-30 2 views
0

Я пытаюсь написать функцию JavaScript, которая возвращает результаты запроса Elasticsearch v5. Я не могу понять, где и как включить «возврат» в этот код. При следующем сегменте search (id) возвращает объект Promise, {_45: 0, _81: 0, _65: null, _54: null}. _65 содержит массив правильных ударов, но я не могу понять, как его разобрать. Консоль.log (hits) производит тот же массив, но как я могу вернуть его из функции?Функция Javascript для возврата результатов поиска Elicsearch

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

я забыл опубликовать свое исправление, извините: – kgeo

ответ

0

Я бы instanitate новый массив за пределами вашей функции client.search в глобальном масштабе и Array.push свои «хиты», затем получить доступ к недавно заполненный массив.

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

Это не делает этого, к сожалению, , Ваш подход дублирует созданный массив массивов ('var hits = resp.hits.hits;'). Я могу выполнить итерацию через хиты [] и распечатать его содержимое на консоли, но если я попытаюсь «вернуть образы», ​​я получаю объект Promise, с которым я ничего не могу сделать. Я надеюсь, что кто-то скажет мне, что такое объект Promise и как управлять им. – kgeo

0

Прежде всего, клиент elasticsearch работает расслоение плотной с Promise (я думаю, с помощью обратного вызова также возможно).

Использование Promise - хороший способ обработки асинхронных вычислений.

В вашем вопросе, вы уже сделали что-то с обещанием:

var search = function(id) 
{ 
    var searchParams = { /** What your search is **/} 
    return client.search(searchParams) 
} 

Этот вызов возвращает обещание. Если рассматривать 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 
} 

В коде handleResponse вызывается один раз обещание fullfield. И в этом коде вы обрабатываете данные. Не забывайте, что вы в асинхронном режиме, вам нужно продолжать работать с обещанием обрабатывать хиты.

Кстати, в вашем вопросе, что вы сделали, используя «then», это цепочка Promise. Нормально иметь обещание.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then Promise.prototype.then возвращает обещание.

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. 
      }) 
} 
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 
    } 
} 
Смежные вопросы