2011-08-14 73 views
0

我有關於同步請求的問題。爲什麼在使用同步請求時需要返回請求之外的值?

背景:我需要在結賬前立即獲取用戶的用戶ID。如果userID爲null或零,我將強制用戶登錄。我決定使用同步請求。我瞭解異步請求和同步請求之間的區別。不過,我不明白爲什麼下面的第一個代碼不起作用,但第二個代碼不行。

... 
UserId = GetUserId(); 
... 

function GetUserId() 
{ 
    var jsonRequest = new Request({url: myurl, async: false, onComplete: function(result) {return result;}}).get(); 
} 

當我使用上面的代碼時,我得到UserId = undefined。但是它的工作原理,當我用下面

... 
UserId = GetUserId(); 
... 

function GetUserId() 
{ 
    var resultreturned; 
    var jsonRequest = new Request({url: myurl, async: false, onComplete: function(result) {resultreturned = result;}}).get(); 
    return resultreturned; 
} 

代碼在我看來,在第一個代碼,該處理不即使我使用了異步停止:假的。在第二個代碼中它起作用。

有誰知道爲什麼?

另外,有沒有一種方法來訪問返回的id,而不使用var resultRed返回?我可以使用類似

返回jsonRequest.value或jsonRequest.result或其他東西嗎?

謝謝。

+0

爲什麼你準確地使用同步請求?異步請求無法正常工作嗎? – outis

+0

因爲如果我使用異步請求,代碼在等待userId返回時不會停止。系統會認爲沒有userId並會顯示登錄屏幕。我認識到AJAX是作爲一個異步過程創建的。但在這種情況下,我不認爲它會作爲異步請求。謝謝。 – jdias

+0

爲什麼不能在異步請求返回時使用回調來顯示登錄屏幕,而不是當'GetUserId'返回時? – outis

回答

0

GetUserId的第一個版本不返回任何內容。就那麼簡單。作爲完成處理程序傳遞的匿名函數返回某些內容並不重要;它的返回值被傳遞給一些內部的mootools函數並被忽略。

作爲訪問結果,基XMLHttpRequest對象應該是作爲請求對象的xhr屬性進行訪問(雖然這並不似乎是Request's public interface一部分),和響應(依次)是作爲可接入responseText XHR對象的屬性。總之,嘗試:

jsonRequest.xhr.responseText 

但是,這不應該是必要的。任何同步請求都可以通過傳遞迴調在請求完成時運行成爲異步請求。您作爲onComplete參數傳遞的函數就是一個例子。這有一個技術名稱「continuation passing」(「continuation」有點非正式,「計算的其餘部分,從一個給點的前瞻」)。

暫時忘掉調用堆棧。假設return聲明只是另一個功能。這return功能是一個延續;當它被調用時,剩下的計算就會發生。切換到異步調用的第一步是讓GetUserId函數調用傳入的延續,而不是特殊的return延續。

function GetUserId(succeed, fail) 
{ 
    var resultreturned; 
    var jsonRequest = new Request({url: myurl, async: false, onSuccess: function(result) {resultreturned = result;}, onFailure: fail}).get(); 
    succeed(resultreturned); 
} 

爲了完成切換,傳遞給Request延續,而不是在GetUserId調用它,並且使該請求是異步的。

function GetUserId(succeed, fail) 
{ 
    new Request({url: myurl, onSuccess: succeed, onFailure: fail}).get(); 
} 

... 
function checkoutOrLogin(userId, responseXML) { 
    if (userId) { 
     /* continue checkout */ 
    } else { 
     /* display login form */ 
    } 
} 
GetUserId(checkoutOrLogin, function(xhr) {/* display error message */}); 
+0

明白了。我沒有意識到我不能在onComplete函數中做返回。我試過了jsonRequest.xhr.responseText,它工作。謝謝。 (不幸的是我不能投你的問題,因爲我沒有足夠的聲譽......) – jdias

0

問題在於範圍。在第一個示例中,您將從未分配給任何變量的匿名函數返回值。

+0

謝謝你的迴應。我想還是有很多需要了解的Ajax ...:O) – jdias

相關問題