2012-02-13 115 views
2

下面的代碼總是返回「未定義」爲什麼這個總是返回「未定義」

function sendCommand(cmdJson){ 
    chrome.extension.sendRequest(cmdJson, function(response){ 
     return response; 
    }); 
} 

我也試過這個變種具有相同的結果

function sendCommand(cmdJson){ 
    var msg; 
    chrome.extension.sendRequest(cmdJson, function(response){ 
     msg = response; 
    }); 
    return msg; 
} 

如果我做一個alert(response);代替的return response;我得到預期的價值。

回答

4

我猜chrome.extension.sendRequest是異步的,在這種情況下sendCommand不會返回任何東西。sendCommand中的響應處理程序是返回某個內容的那個,但這不相同,因爲sendCommand返回了一些內容。所以當你撥打sendCommand時,它會返回undefined

基本上,sendCommand調用chrome.extension.sendRequest功能,然後返回undefined向右走,而chrome.extension.sendRequest功能仍在運行。

沒有真正的方法讓異步行爲同步 - 最好重構你的代碼。

+0

好,我想'chrome.extension.sendRequest(cmdJson,函數(響應),而它等待響應{}'會阻止。 – ZeroDivide 2012-02-13 01:20:43

+0

@ZeroDivide好吧,我承認我不知道Chrome擴展API,但根據你描述的行爲來判斷,我認爲「sendRequest」是異步的是一個公平的選擇 – Flambino 2012-02-13 01:22:55

+0

是的,它的內容如何(注入到網頁中)與擴展的後臺腳本(一個腳本在後臺運行)。我想我會假設它會成功,而不是將響應傳遞迴調用函數。 – ZeroDivide 2012-02-13 01:24:19

0

這很可能是因爲您正在執行ajax調用,這本質上是異步的。異步函數無法返回值,因爲無法知道異步調用何時完成。

如果您使用的是jQuery,那麼您有兩個備選方案來解決此問題。如果您使用jQuery 1.5或更高版本,則可以使用延遲對象。延遲對象是jQuery允許您用來與異步代碼進行交互的新對象。默認情況下,jquery ajax函數(例如$ .ajax,$ .get,$ .post,$ .getJSON)會返回一個Deferred Object,所以您只需將ajax調用存儲在一個變量中,然後調用jQuery Deferred Object api中列出的可用方法。這是我在jQuery Deferred Objects上看到的最好的教程之一。 http://www.erichynds.com/jquery/using-deferreds-in-jquery/

var sendResponse = $.get("/getResponse"); 

//Somewhere else in your code 
sendResponse.success(function(response) { 
    return response; 
}); 

其他選項是讓你的jQuery ajax調用同步。您可以通過將async ajax屬性設置爲false來完成此操作。

$.ajax({ 
    url: "someURL", 
    async: false 
});