Javascript等待函数返回

时间:2014-01-13 16:47:44

标签: javascript

我在一个循环(见下文)中有一个函数“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...

    }
  }
}

3 个答案:

答案 0 :(得分:2)

您可以使函数将值返回给变量。这样程序将暂停,直到该功能运行。像这样:

var maps = add_maps_from_json(json);

或者您可以使用plugin.js并进行模块调用。

http://requirejs.org/docs/plugins.html

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