2016-11-30 12 views
0

Elasticsearch v5クエリの結果を返すJavaScript関数を作成しようとしています。私はこのコードに 'return'をどこにどのように含めるかを理解できません。以下では、segmentSearch(id)はPromiseオブジェクト{_45: 0, _81: 0, _65: null, _54: null}を返します。 _65には正しいヒットの配列がありますが、解析する方法を理解できません。 console.log(ヒット)は同じ配列を生成しますが、関数からどのように戻すことができますか?Elasticsearchの結果を返すJavascript関数

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

私はその後、新しく満たされた配列にアクセスするには、グローバルスコープでのごclient.search機能の外に新しい配列をinstanitateし、あなたの「ヒット」の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オブジェクトが何であるか、それをどう管理するかを教えてくれることを願っています。 – kgeo

0

まず、elasticsearch jsのクライアントは、約束(私はコールバックを使用しても可能だと思います)と協力しています。

プロミスを使用すると、非同期計算を処理する良い方法です。あなたの質問に

は、すでに約束して何かを行っている:

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

この呼び出しは約束を返しています。 私たちはあなたのコードでは、あなたのその後

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されると、のhandleResponseが呼び出されます。そのコードではデータを処理しています。あなたは非同期的であることを忘れないでください。ヒットを処理することを約束し続ける必要があります。

ところで、あなたの質問では、「当時」を使って何をしたのかは、プロミスを連鎖させることです。プロミスを持つことは通常のことです。

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 
    } 
} 
関連する問題