2016-04-21 52 views
0

因此,如果我用$.get('/preceed_with_an.txt', function(data){var ans = data.split('\n')});替換ans = ["filler","more filler"],但是當$ .get行在其中時拒絕執行for循環並且沒有任何內容寫入控制檯。對於上下文,我正在編寫代碼,告訴您是否應該在單詞之前使用A或AN。您使用的單詞全部在preceed_with_an.txt的單獨行上我已經檢查了$ .get函數,並且文件被寫入到數組中。For Loop永不執行(Javascript/Jquery)

$(document).on('input',$('#givenWord'),function(){ 
     var ans = new Array; 
     $.get('/preceed_with_an.txt', function(data){var ans = data.split('\n')}); 
for (var i = 0; i < ans.length; i++){ 
    console.log("help"); 
    if (ans[i] == $('#givenWord').lower){ 
     var answer = $("#answer"); 
     console.log("AN"); 
     $(answer).text("An"); 
     break; 
    }else{ 
     var answer = $("#answer"); 
     console.log("A") 
     $(answer).text("A"); 
    } 
    } 
}); 

回答

2

get()是異步的,所以因爲後的數據返回for循環執行ans.length等於零。

你必須在get()回調函數來執行for循環:

$.get(url, function(data) { 
    var arr = data.split(','); 
    for(...) { 
     //... 
    } 
}); 

執行流程(代碼)

  1. 創建ANS陣列
  2. 調用get()功能
  3. 嘗試執行for循環(無可用數據)
  4. get()返回數據

異步呼叫

  1. 創建ANS陣列
  2. 調用get()功能與回調for
  3. get()返回數據並執行回調 - > for循環與數據

檢查結果控制檯。即使在console.log()之前調用了setTimeout函數,代碼仍會繼續執行並等待回調的答案(1秒後)。當結果出來的時候,回調執行:

var def = $.Deferred(); 
 

 
def.done(function(data) { 
 
    console.log(data); 
 
}); 
 

 
//Asynchronus call (delays for 1 second) 
 
setTimeout(function() { 
 
    def.resolve('Callback after 1 second') 
 
}, 1000); 
 

 
//Execute immediately 
 
console.log('Write something!'); 
 

 
//Console results 
 
// 1. Write something 
 
// 2. callback (after 1 second)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

檢查這些有關異步功能鏈接:

jQuery.get()

Async