2013-06-18 78 views
0

我使用Elastic.js來訪問ElasticSearch並運行查詢....我需要運行一個方面並得到結果並使用此結果進行另一個查詢...我能夠獲取第一個結果並使用結果運行查詢,但由於執行順序的問題,無法訪問第二個回調中的第一個查詢詞。如果我使用JS的setTimeout()即可獲得所需的結果。值回調函數內部undefined

那麼有沒有更好的選擇setTimeout?

for(i in res_week){ 
     if(res_week[i].term !=null){ 
      var sourceFilter = ejs.TermsFilter("source",res_week[i].term); 
       var data2 = []; 
       var term_temp = res_week[i].term; 
       var count_temp = res_week[i].count; 
       var typesCallback = function(typeResults){ 

        console.log(typeResults); 
        var temphold = typeResults.facets.srctype_list.terms; 
        data2.push(temphold); 
        console.log(term_temp); 


       }; 
       data.push({"list":data2}); 
       var temp_r = ejs.Request() 
         .indices(index) 
         .types(type) 
         .facet(listfacet 
      .facetFilter(ejs.AndFilter([timeLimit,sourceFilter]))); 

       console.log(temp_r); 
       temp_r.doSearch(typesCallback); 



         } 

在這裏我無法訪問typesCallback函數內部res_week []的條款和它說不確定,通過使用臨時變量i得到函數內部而不是在第一次迭代中那些術語,而是來自僅第二次迭代。

+0

你能分享你的代碼嗎? –

+0

@ArunPJohny代碼添加 – Sreelal

回答

0

如果您需要在第二個回調之前運行第一個回調,請將第二個過濾器調用放在第一個回調中。

你的代碼(重新排序):

for(i in res_week){ 
    if(res_week[i].term !=null){ 
     var sourceFilter = ejs.TermsFilter("source",res_week[i].term); 
     var data2 = []; 
     var term_temp = res_week[i].term; 
     var count_temp = res_week[i].count; 
     var typesCallback = function(typeResults){ 

      console.log(typeResults); 
      var temphold = typeResults.facets.srctype_list.terms; 
      data2.push(temphold); 
      console.log(term_temp); 

      data.push({"list":data2}); 

      var temp_r = ejs.Request() 
        .indices(index) 
        .types(type) 
        .facet(listfacet.facetFilter(ejs.AndFilter([timeLimit,sourceFilter]))); 

      console.log(temp_r); 

     }; 

     temp_r.doSearch(typesCallback); 
    } 
} 
+0

這是我做的第一件事,我已經把第二個過濾器放在第一個回調中,並且我需要在回調中使用第一個結果進行循環,並且循環的第一個迭代激發了一個錯誤, 「值未定義」。這就是爲什麼我試圖使用超時的外部函數調用,使用超時它適用於我,但我需要避免使用setTimeout ..... – Sreelal

0

我已經解決了這個問題。而不是使用setTimeout,我做了一個不同的函數,並在回調結束時調用該函數,並將所需結果作爲傳遞參數。 ,並且這也將過濾器從第一個回調中移出。

感謝您的回覆傢伙。 :)