0

我正在使用 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[] 的术语,它说未定义,通过使用临时变量,我在函数内部获取这些术语,但不是在第一次迭代中,而是仅从第二次迭代中获取。

4

2 回答 2

0

I have solved the problem. Instead of using setTimeout, i have made a different function and called that function at the end of callback with required result as the passing parameter. and this brought the filters out from the first callback too.

Thanks for the responses guys. :)

于 2013-06-19T10:09:44.903 回答
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);
    }
}
于 2013-06-18T11:33:11.817 回答