2013-02-19 27 views
0

我沒有在這一點上使用JSON或jQuery的 - 普通的香草的Javascript答案只有請(我發現了一堆答案在SE這個問題,但它們都包括jQuery的或JSON)。如何確保在調用window.onload內部的新函數之前完成Ajax調用?

我有一個window.onload=function(){...事件處理器內部的兩個功能。第一功能fillArray(from,to)是以下形式的Ajax調用:

function fillArray(from,to){ 
    request = createRequest(); 
    if (request == null) { 
    return; 
    } 
    var url= "Ajax_retrieveNames.php?indexFrom=" + from + "&indexTo=" + to; 
    request.open("GET", url, true); 
    request.onreadystatechange = populateArray; 
    request.send(null); 
} 

function populateArray(){ 
    var xmlFrag=null; 
    if (request.readyState == 4) { 
    if (request.status == 200) { 
     xmlFrag = request.responseXML; 
     for(var i=indexFrom; i<=indexTo; i++){ 
     fcArray[i]=new Array(); 
     var f=xmlFrag.getElementsByTagName("first")[i].childNodes[0].nodeValue; 
     var l=xmlFrag.getElementsByTagName("last")[i].childNodes[0].nodeValue; 
     fcArray[i][0]=f; 
     fcArray[i][1]=l; 
     } 
    }else{ 
     return; 
    } 
    }else{ 
    return; 
    } 
} 

第二功能用的格式和(第一在這種情況下)顯示下一的元素showNextName()交易子陣列。在這一點上,var arrayIndex設置爲0:

function showNextName(){ 
    displayQuestion() // Deals with page formatting 
    document.getElementById('firstName').innerHTML=fcArray[arrayIndex][0]; 
    document.getElementById('lastName').innerHTML=fcArray[arrayIndex][1]; 
    updateArrayIndex(); // Is a counter that increments the variable arrayIndex 
} 

我的問題是,腳本進入第二個功能,showNextName(),完成Ajax調用和填充前陣。我可以通過在兩個功能之間加入計時器來解釋這一點,但這很笨拙。有沒有更好的辦法,以確保我們不會陷入showNextName()或離開window.onload直到Ajax調用完成並填充數組?

回答

1

呼叫showNextName在你的成功回調(populateArray)。由於AJAX是異步的,當readyState爲4時,您需要根據它執行邏輯,就像您在populateArray函數中所做的那樣。

function populateArray(){ 
    var xmlFrag=null; 
    if (request.readyState == 4) { 
    if (request.status == 200) { 
     xmlFrag = request.responseXML; 
     for(var i=indexFrom; i<=indexTo; i++){ 
     fcArray[i]=new Array(); 
     var f=xmlFrag.getElementsByTagName("first")[i].childNodes[0].nodeValue; 
     var l=xmlFrag.getElementsByTagName("last")[i].childNodes[0].nodeValue; 
     fcArray[i][0]=f; 
     fcArray[i][1]=l; 
     } 
     showNextName(); 
    }else{ 
     return; 
    } 
    }else{ 
    return; 
    } 
} 
+0

這一工程,但我用'populateArray'在其他情況下,我不想叫'showNextName()'。我想我可以使用一個變量作爲一個標誌,只調用'showNextName()'如果標誌是「漲」 ... – JDelage 2013-02-19 14:02:55

+0

@JDelage或者你可以從你的脫鉤''populateArray'檢查readyState',你只當它調用需要。 – marteljn 2013-02-19 14:04:27

1

唯一明智的解決方法是調用showNextName從內populateArray,一旦後者已完成其工作。

+0

這可以工作,但我在其他情況下使用'populateArray',我不想調用'showNextName()'。我想我可以使用一個變量作爲標誌,只有在標誌爲「up」時才調用showNextName()... – JDelage 2013-02-19 14:03:13

相關問題