2016-11-30 101 views
0

我正在嘗試編寫一個返回Elasticsearch v5查詢結果的JavaScript函數。我無法弄清楚在哪裏以及如何在代碼中包含'return'。通過以下內容,segmentSearch(id)返回一個Promise對象{_45: 0, _81: 0, _65: null, _54: null}。 _65擁有正確匹配的數組,但我無法弄清楚如何解析它。 console.log(命中)產生相同的數組,但我怎樣才能從函數中返回它?Javascript函數返回Elasticsearch結果

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

這不這樣做,很遺憾。你的方法重複已經創建的命中數組('hits = resp.hits.hits;')。我可以遍歷命中[]並將其內容打印到控制檯,但是如果我嘗試「返回命中;'我得到一個Promise對象,我無法做任何事情。我希望有人能告訴我Promise對象是什麼以及如何管理它。 – kgeo

0

首先,elasticsearch JS客戶端與承諾的工作(我想用回調也是可以的)。

使用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 
} 

在代碼中,一旦承諾則fullfield用handleResponse被調用。在那個代碼中你正在處理數據。不要忘記你是不同尋常的,你需要繼續努力處理命中。

順便說一下,在你的問題中,你使用「then」所做的是鏈接Promise。有承諾是正常的。

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

我忽略發佈我的修復,對此抱歉。順序是創建searchParams,執行client.search(searchParams)返回命中的承諾,然後再處理那些點擊:

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