Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在for循环中的回调完成后,如何执行函数?_Javascript_Google Maps Api 3_Callback - Fatal编程技术网

Javascript 在for循环中的回调完成后,如何执行函数?

Javascript 在for循环中的回调完成后,如何执行函数?,javascript,google-maps-api-3,callback,Javascript,Google Maps Api 3,Callback,我在搜索函数中有一个for循环,其中一个函数执行回调,该回调在循环中执行回调,我想在循环结束后,在所有回调完成后执行BUILD()函数。我不知道怎么做,因为循环在所有回调完成之前就完成了。回调是获取数据的API请求,我希望使用该数据构建() 我阅读了deferred,所以我尝试将for循环放在deferred的函数中,然后在“.then(…)”上调用BUILD()。但这似乎不起作用——我想我理解错了 救命啊 注意,这是使用GoogleMapsPlacesAPI(搜索和获取详细信息) var类型=

我在搜索函数中有一个for循环,其中一个函数执行回调,该回调在循环中执行回调,我想在循环结束后,在所有回调完成后执行BUILD()函数。我不知道怎么做,因为循环在所有回调完成之前就完成了。回调是获取数据的API请求,我希望使用该数据构建()

我阅读了deferred,所以我尝试将for循环放在deferred的函数中,然后在“.then(…)”上调用BUILD()。但这似乎不起作用——我想我理解错了

救命啊

注意,这是使用GoogleMapsPlacesAPI(搜索和获取详细信息)

var类型={
‘健身房’:‘健身,健身房’,
“杂货店或超市”:“
}
函数搜索(){
for(变量键输入类型){
var请求={…};
服务.搜索(请求,搜索回调);
}
//问题领域
BUILD();
}
函数searchCallback(结果、状态){
对于(var i=0;i
只需对代码稍加修改即可实现

var total = 1337; // Some number
var internal_counter = 0;
var fn_callback = function() {
    searchCallback.apply(this, arguments);
    if (++internal_counter === total) {
        BUILD();
    }
};
for (var i=0; i<total; i++) {
    service.search(request, fn_callback);
    ...
注释中解释了功能逻辑。我在本节的标题前面加了“Complex”,因为函数使用了嵌套的局部函数和变量。直观的解释:

var types, BUILD;
function search
    var keys, total, internal_counter, fn_searchCallback;
    function fn_searchCallback
        var result, status; // Declared in the formal arguments
        var local_counter, i, fn_detailsCallback;
        function fn_detailsCallback
            var result, status; // Declared in the formal arguments
在上图中,每个缩进级别表示一个新的缩进级别。

当一个函数被调用42次时,就会创建42个新的本地作用域,它们共享相同的父作用域。在某个范围内,对父范围不可见。尽管父作用域中的变量可以由“子”作用域中的变量读取和更新,但前提是您不使用相同的名称声明变量。我的answer函数中使用了此功能。

我想您已经理解了这一点,但实际上,BUILD()是在前面的回调函数仍在运行的情况下被线性调用的。就像你创造了额外的线程。解决此问题的一种方法是从搜索函数生成一个包含for循环的回调函数。这将保证在调用之前所有功能都已完成


这个问题可能有助于实现回调:

什么是searchCallback.apply(这个,参数)?我不明白这句话-我应该在参数里放些什么?默认情况下,searchCallback接受“results”和“status”,但这在fn_回调中不可用。@poleapple是无缝调用函数的通用方法。有关
.apply
方法的说明,请参阅链接文档。如果上下文不重要,您也可以使用
fn_callback=function(a,b){searchCallback(a,b);}
例如。好的,谢谢!这对我的第一次搜索回调非常有效。但是,searchCallback中的detailsCallback在searchCallback完成后才会执行,所以我想我必须执行双计数器之类的操作…@poleapple我看不到该注释与您当前的代码之间的关系。在您当前的代码中,每个响应都会立即执行
detailsCallback
。因此,我完全按照您所展示的那样做,在所有SearchCallback完成后会调用BUILD,然而,detailsCallback仅在SearchCallback完成后才开始执行。所以BUILD现在在detailsCallback执行之前执行,但是我需要在detailsCallback执行之后执行BUILD。但是如果我在搜索函数中执行for循环,然后调用调用BUILD的回调,这不是一回事吗?在for循环完成之后和for循环内的回调完成之前,BUILD仍将执行。现在的BUILD不是来自搜索函数的回调,它只是循环之后的下一个操作。我最近遇到了一个类似的问题,我的下一行在函数完成之前执行,但是将下一行放在回调中确保它在所有事情完成时发生。
var types = { '...' : ' ... ' };

function search() {
    var keys = Object.keys(types);
    var total = keys.length;
    // This counter keeps track of the number of completely finished callbacks
    //  (search_callback has run AND all of its details_callbacks has run)
    var internal_counter = 0;

    for (var i=0; i<total; i++) {
        var request = { '...' : ' ... ' };
        services.search(request, fn_searchCallback);
    }

    // LOCAL Function declaration (which references `internal_counter`)
    function fn_searchCallback(results, status) {
        // Create a local counter for the callbacks
        // I'm showing another way of using a counter: The opposite way
        // Instead of counting the # of finished callbacks, count the number
        //  of *pending* processes. When this counter reaches zero, we're done.
        var local_counter = results.length;
        for (var i=0; i<results.length; i++) {
            service.getDetails(request, fn_detailsCallback);
        }
        // Another LOCAL function (which references `local_counter`)
        function fn_detailsCallback(result, status) {

            // Run the function logic of detailsCallback (from the question)
            // " ... add place marker to maps and assign info window ... "

            // Reduce the counter of pending detailsCallback calls.
            //   If it's zero, all detailsCallbacks has run.
            if (--local_counter === 0) {
                // Increase the "completely finished" counter
                //  and check if we're finished.
                if (++internal_counter === total) {
                    BUILD();
                }
            }
        } // end of fn_detailsCallback
    } // end of fn_searchCallback
}
var types, BUILD;
function search
    var keys, total, internal_counter, fn_searchCallback;
    function fn_searchCallback
        var result, status; // Declared in the formal arguments
        var local_counter, i, fn_detailsCallback;
        function fn_detailsCallback
            var result, status; // Declared in the formal arguments