2012-09-23 54 views
4

排序是這樣的:如何在ajax調用的結果到來之後返回函數的值?

function getfoo() { 
    var foo = ""; 
    $.get("foofile.html", function (data) { 
    foo = data; 
    }); 
    return foo; 
} 

但後來因爲腳本是異步的,則返回「」。這顯然不是我想要的。

於是我嘗試這樣做:

function getfoo() { 
    var foo = ""; 
    $.get("foofile.html", function (data) { 
    foo = data; 
    }); 
    for (;;) { 
    if (foo != "") { 
     return foo; 
     break; 
    } 
    } 
} 

而且我預計,到工作,但事實並非如此。爲什麼不?有人可以提出一個解決方案嗎?

回答

2

您應該使用回調函數並讓它處理您的數據。

function getfoo(callback) { 
    var foo = ""; 
    $.get("foofile.html", function (data) { 
    callback(data); 
    // do some other things 
    // ... 
    }); 
} 

getfoo(function(data) { 
    console.log(data); 
}); 
+0

然後,我會做什麼,如果我想從'getfoo'函數內部返回值? – think123

+0

我不能在'GET'函數中使用'return',對嗎? – think123

+0

@ think123是的,你不能。 – xdazz

1

ajax的第一個「a」代表異步,所以你所要做的就是反對ajax的哲學。然而,它是可以使用禁止請求,但這不是由.get簡化的界面支持,你必須使用.ajax功能:

var foo = "hmmm"; 
$.ajax("jquery.js", {async:false, success:function(x){foo=x}}); 
alert(foo); 

的JavaScript基本運行模式是基於事件和單線程(有網絡工作者提供多線程能力,但每個工作人員都居住在自己的地址空間中,不能與其他工作人員或主線程共享任何內存......所以從某種意義上說,他們更像是進程而不是線程)。

在Javascript中做其他的事情發生循環您不能「等待」,你的函數必須總是很快結束,可能是連接回調有事時再次調用。如果你做了一個循環,那麼JavaScript引擎就會陷入循環,並且不允許做其他處理(如果這是從javascript可見的)。例如:

// Warning: WRONG example... this won't work! 
var foo = 0; 
setTimeout(function(){foo = 1}, 100); // Set foo=1 after 100ms 
while (foo == 0) ; // Wait for that to happen 
alert(foo); 

是行不通的,因爲瀏覽器引擎是不允許的,直到主代碼路徑到達終端執行其他JavaScript代碼(超時回調)。

此事件爲基礎的方法簡化了編程相當多的(因爲沒有需要鎖定......總是有隻是一個單一線程操作的狀態),但勢力利用長期操作不同的流程設計。

,有執行的單個線程的事實也意味着,當你的JavaScript代碼做任何長時間的計算一切將被鎖定,瀏覽器的外觀沒有響應用戶。

這種反應遲鈍的原因是爲什麼使用同步調用來檢索資源被認爲是不好的做法......同時從多個流獲取不同資源的困難工作已由瀏覽器實現,但您的JavaScript代碼需要使用一個回調模型能夠利用這個特性。

+0

不是很有幫助,你知道...... – think123

+0

@ think123:添加了'.ajax'示例。從你的問題看來,我不瞭解基本的JavaScript執行模型(沒有共享內存併發)。 – 6502

+0

這樣比較好。謝謝! – think123

1

使用ajax時,應該以不同的方式編寫代碼。你應該分開你的調用者和被調用者邏輯。

假設你現有的代碼是這樣

function getfoo() { 
    var foo = ""; 
    $.get("foofile.html", function (data) { 
    foo = data; 
    }); 
    return foo; 
} 

function usefoo(){ 
    var data = getfoo(); 
    // do something with data 
} 

它確實應該這樣寫

function getfoo() { 
    var foo = ""; 
    $.get("foofile.html", function (data) { 
    usefoo(data); 
    }); 
} 

function usefoo(data){ 
    // do something with data 
}