回调函数中的值未定义

时间:2013-06-18 09:45:45

标签: javascript jquery elasticsearch

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

2 个答案:

答案 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,而是创建了一个不同的函数,并在回调结束时调用该函数,并将所需的结果作为传递参数。 这也使过滤器从第一次回调中解脱出来。

感谢回复人员。 :)