【问题标题】:How to check if all async tasks have finished如何检查所有异步任务是否已完成
【发布时间】:2014-03-04 06:52:46
【问题描述】:

我正在构建一个基于 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() 任务完成时,如何设置一个调用函数的处理程序?

【问题讨论】:

标签: javascript jquery asynchronous here-api


【解决方案1】:

您可以使用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();
}

【讨论】:

  • 谢谢!似乎它有效,我从地址获取地理编码数据,但是 $.when.apply() 函数永远不会触发。我在里面放了一个警报,我记录了所有结果,但是即使记录了所有结果,也没有任何警报。也许是因为它在表单提交事件中?
  • @Trisztan 我不确定为什么这不起作用。我设置了一个 jsfiddle(使用谷歌地图地理编码,因为我可以访问它)并且它正在工作:jsfiddle.net/EkLr7。希望它可以帮助您朝着正确的方向前进。
【解决方案2】:

使用延迟的 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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2018-04-18
    • 2023-01-17
    相关资源
    最近更新 更多