2014-01-13 72 views
0

我有一個函數「add_floor(XXX)」(參見下文),需要一些時間才能完成,所以我想知道如何等待這個功能之前返回轉到下一步,這是我的情況「添加dawfeature點」。我知道我可以使用回調方法,但是我需要重新啓動遍歷回調函數中的json元素的完整循環。不是很性感,那麼有沒有辦法避免這種情況?的Javascript等功能在循環返回

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

的唯一方式,它不會只是跟着從前面的代碼是如果你正在創建匿名函數或做Ajax調用或任何超時功能? – rorypicko

+2

這裏有沒有任何AJAX調用?否則,這應該是同步的。它意味着它會等到它返回之前完成。如果您使用的是AJAX調用,那麼*唯一方法就是使用回調函數。 –

+0

'add_floor()'做了什麼? Assync呼叫? – DontVoteMeDown

回答

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

如果add_floor沒有做一個Ajax調用,那麼您的代碼將正常工作,因爲它是現在。

如果add_floor DOES做一個Ajax調用,然後你可以把一個單獨的函數,你再爲回調爲add_floor Ajax調用使用內內for循環。

+0

除了使用Ajax之外,還有其他方法可以創建非阻塞調用 - 例如web工作者或使用setTimeout(作爲[Clumpy庫](http://www.tumuski.com/code/clumpy/overview/) )的確可以模擬非阻塞循環)。 –

1

可以使函數返回一個值給一個變量。這樣程序會暫停,直到函數運行。像這樣:

var maps = add_maps_from_json(json); 

或者您可以使用plugin.js並執行模塊調用。

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

+0

嗨,返回值技巧不起作用,我會看看plugin.js – tony590