我正在使用Elastic.js访问ElasticSearch并运行查询....我需要运行一个方面并获得结果并将此结果用于另一个查询...我能够得到第一个结果一个并使用结果运行查询,但由于执行顺序问题,无法访问第二个回调内的第一个查询项。如果我使用JS的setTimeout()即可获得所需的结果。
那么有没有更好的替代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 []的术语,并且它表示未定义,通过使用临时变量,我在函数内部获取这些术语但不在第一次迭代中,而是仅从第二次迭代中获取。
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
我已经解决了这个问题。我没有使用setTimeout,而是创建了一个不同的函数,并在回调结束时调用该函数,并将所需的结果作为传递参数。 这也使过滤器从第一次回调中解脱出来。
感谢回复人员。 :)