我正在构建一个基于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()任务完成后设置调用函数的处理程序?
答案 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);
});