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

时间:2014-03-03 22:29:22

标签: javascript jquery asynchronous here-api

我正在构建一个基于HERE MAPS的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");
    }
}

因此,在地理编码过程完成后,我想计划行车路线。问题是,我不知道所有地理编码过程是否都已完成。如果用户提交ex。 150个地址,比提交2个地址需要更长的时间。

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

2 个答案:

答案 0 :(得分:2)

您可以使用promises

$('.form-directions').on('submit', function () {
    var promises = [];
    waypoints = [];
    $('.waypoint').each(function () {
        promises.push(geoCode($(this).val()));
    });
    $.when.apply(null, promises).then(function() {
        // Everything is done, do something
    });
    return false;
});

然后在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();
}

答案 1 :(得分:0)

使用jquery延迟。示例代码:

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);
});