2012-12-21 64 views
5

我知道它的一個很長的問題,所以請允許我盡我所能地解釋。如何執行一個JavaScript函數需要一個值後,onload函數完成,給出的價值?

我有兩個JavaScript函數,我想在頁面加載後運行,我們將稱它們爲function1()和function2()。

function1()使用AJAX從數據庫中檢索信息,該信息將從數據庫中獲取的信息中排列div中的內容。一旦函數完成,它也會返回數據庫中的內容。爲了正確運行,function2()需要數據庫中的值,所以需要等到function1()在function2()運行前返回它的值。不幸的是我的代碼不能正常工作,並沒有考慮太多細節,下面是代碼的示意圖:

function function1() { 
if (some_cookie_exists) { 
    //run some code 
} else { 
    //send parameters through "POST" 
    xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
    var a = some_value_from_database; 
    // change div content 
    return a; 
    } 
    } 
//sending parameters 
} 
function function2(a) { 
//run code that depends on value of "a" 
} 

window.onload = function() { 
var data = function1(); 
function2(data); 

我得到的錯誤是,VAR的數據是不確定的。 function1()成功檢索數據,並按我的意圖運行,但函數2()根本不執行,因爲缺少值。任何人都可以找出爲什麼我得到這個,我應該如何去解決這個問題?

注意:我真的只熟悉Javascript(仍然是新手),我對JQuery一無所知,所以如果你確實使用它來修復代碼,請向我解釋爲什麼這會起作用(它會拯救我麻煩後)

回答

4

AJAX是異步的(這是第一個A代表)。 AJAX操作的結果在函數1()中不可用,它們在連接到XMLHttpRequest對象的onreadystatechange處理程序中檢索。因此,目前還不清楚如何,你可以在function1()

var a = some_value_from_database; 

你需要做的是從onreadystatechange處理程序中調用function2()

如果您發佈實際執行function1我們也許能夠提供更具體的細節。

UPDATE:

下面是如何調用function2()當值從AJAX調用可用:

xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     var a = some_value_from_database; 
     function2(a); 
    } 
} 
+0

不知道到底自己,但是當我取回的價值,我從數據庫中獲取值。就像我說的,我對JavaScript比較陌生 –

+0

我已經將函數放在 –

+0

以上函數在哪裏? – Barmar

4

有回調做它。

function function1(callback) { 
    /* ... */ 
    callback(data); // instead of return 
} 
var function2 = function(data) { // important: make "function2" a variable so that it can be passed as an argument later on 
    /* ... */ 
}  
window.onload = function() { 
    function1(function2); // important: no parentheses after function2, otherwise it would be executed right away 
} 
+0

回調到底是什麼?我記得在其他地方讀過它,但不明白它 –

+0

回調的概念意味着你不會傳遞返回值,而是傳遞下一個要執行的函數。 – akirk

0

由於定義的ajax是異步的,所以function2將在ajax在function1中完成之前開始執行。 JQuery在這裏很有用,因爲你可以將function2放在函數1中的ajax調用的成功回調中。

所以包括JQuery的在你的HTML和下面的JS應該工作:

$(function() { //same as onload 
     function1() ; 
} 

function function1() { 
     $.ajax({ 
       url: "url here", 
       type: "GET", 
       success: function(data) { // data is what is returned in ajax response 
          // rearrange divs 
          function2(data); 
       } 
      }); 
); 

function function2(data) { 
} 

更多關於JQuery的AJAX功能在這裏: http://api.jquery.com/jQuery.ajax/

+0

感謝您的信息,我會嘗試一下 –

相關問題