我在一个循环(见下文)中有一个函数“add_floor(xxx)”需要一些时间来完成,所以我想知道如何等待这个函数的返回,然后再转到下一步在我的情况下“添加dawfeature点”。我知道我可以使用回调方法但是我需要重新启动遍历回调函数中的json元素的完整循环。不是很性感,有没有办法避免这种情况?
function add_maps_from_json(json) {
for (var i = 0; i < json.maps.length; i++) {
// add the maps to the combox box and display last one
add_floor(json.maps[i].mapName);
// add the dawfeature points to the map
for (var j = 0; i < json.maps[i].APs.length; j++) {
var idx = find_map_index();
console.log(idx);
var map = mapObjectArray[idx];
etc...
etc...
}
}
}
答案 0 :(得分:2)
您可以使函数将值返回给变量。这样程序将暂停,直到该功能运行。像这样:
var maps = add_maps_from_json(json);
或者您可以使用plugin.js并进行模块调用。
答案 1 :(得分:1)
如果add_floor
没有进行ajax调用,那么您的代码将会正常工作。
如果add_floor
进行ajax调用,则可以将内部for
循环放在一个单独的函数中,然后将其用作add_floor
中ajax调用的回调。 / p>
答案 2 :(得分:1)
正如您所说,您必须向add_floor
添加回调参数,并且为了管理您的循环,您可以执行async loop
,如下所示:
//change the add_floor function
function add_floor(mapName, callback){
//your code
//you probably have some kind of ajax call or setTimeout
//then call your callback after your ajax response or timer callback
//....
callback();
//....
}
function add_maps_from_json(json) {
doLoop(json, 0)
}
function doLoop(json, i) {
if(i < json.maps.length) return;
add_floor(json.maps[i].mapName, function () {
// add the dawfeature points to the map
for (var j = 0; i < json.maps[i].APs.length; j++) {
var idx = find_map_index();
console.log(idx);
var map = mapObjectArray[idx];
//etc...
//etc...
}
doLoop(json, i + 1);
});
}