Javascript 如何检查所有异步任务是否已完成

Javascript 如何检查所有异步任务是否已完成,javascript,jquery,asynchronous,here-api,Javascript,Jquery,Asynchronous,Here Api,我正在构建一个基于地图的web应用程序。我正在尝试实现从>=2个航路点获取行驶方向 所以用户输入他的地址。首先,应用程序必须对这些地址进行地理编码以避免错误 这是表单提交事件处理程序: $('.form-directions').on('submit', function () { waypoints = []; $('.waypoint').each(function () { geoCode($(this).val()); }); return

我正在构建一个基于地图的web应用程序。我正在尝试实现从>=2个航路点获取行驶方向

所以用户输入他的地址。首先,应用程序必须对这些地址进行地理编码以避免错误

这是表单提交事件处理程序:

$('.form-directions').on('submit', function () {
    waypoints = [];
    $('.waypoint').each(function () {
        geoCode($(this).val());
    });
    return false;
});
这是
geoCode()
函数:

function geoCode (address) {
    nokia.places.search.manager.findPlaces({
        searchTerm: address,
        onComplete: onGeoCodingCompleted,
        searchCenter: map.center
    }); 
}
这是一个异步任务,完成后将调用
onGeoCodingCompleted()
,如下所示:

function onGeoCodingCompleted(data, requestStatus, requestId) {
    if (requestStatus == "OK") {   
        var locations = data.results.items;
        waypoints.push(locations[0].position);
    } else if(requestStatus == "ERROR") {
        alert("error");
    }
}
因此,在地理编码过程完成后,我想规划驾驶方向。问题是,我不知道是否所有的地理编码过程都完成了。如果用户提交例如150个地址,则需要比提交2个地址更长的时间

tl;博士 如何设置在所有geoCode()任务完成后调用函数的处理程序?

您可以使用

然后在
geoCode
函数中

function geoCode (address) {
    var deferred = $.Deferred();
    nokia.places.search.manager.findPlaces({
        searchTerm: address,
        onComplete: function(data, requestStatus, requestId) {
            onGeoCodingCompleted(data, requestStatus, requestId);
            deferred.resolve();
        },
        searchCenter: map.center
    });
    return deferred.promise();
}

使用jquerydeferred。示例代码:

function do_stuff(){
    var deferred = $.Deferred();

    $.getJSON('/whatever.php/?callback=?',params,
        function(response){
            deferred.resolve(response);
        });

    });
    return deferred;
}
$.when( do_stuff() , do_stuff() ).done(function(a1, a2) {
    console.log('Stuff 1:' + a1);
    console.log('Stuff 2:' + a2);
});

看看吧,谢谢!它似乎可以工作,我从地址中获取地理编码数据,但是$.when.apply()函数从未启动。我在里面放了一个警报,我记录了所有结果,但即使记录了所有结果,也没有任何警报。也许是因为它在表单提交事件中?@Trisztan我不知道为什么它不起作用。我设置了一个JSFIDLE(使用GoogleMaps地理编码,因为我有权访问它),它正在工作:。希望它能帮助你朝着正确的方向前进。
function do_stuff(){
    var deferred = $.Deferred();

    $.getJSON('/whatever.php/?callback=?',params,
        function(response){
            deferred.resolve(response);
        });

    });
    return deferred;
}
$.when( do_stuff() , do_stuff() ).done(function(a1, a2) {
    console.log('Stuff 1:' + a1);
    console.log('Stuff 2:' + a2);
});