2011-06-21 29 views
0

如果我有一個JS函數如下;Javascript流程或執行問題

function testFn() 
{ 
x.ajaxMethod(param1,JScallBackFunction); //Please do not worry about the syntax..this just indicates an external method call 
alert("Line after ajaxMethod"); 
} 

的ajaxMethod(),可以說是某種形式的外部Java文件(因此它可以通過DWR或任何東西),它會返回一些數據定義的方法的......一點是需要一定的時間來執行這行代碼...

現在我的問題是,當將在下一行警報會被解僱(即ajaxMethod");後警報(「線)

  1. 將它等待這些兩件事情來完成(ajaxMethod執行以及JScallBackFunction)
  2. 它會立即被解僱,而無需等待上述2件事情的任何完成?

另外,如果你可以指導一般的JavaScript方法流程執行,那將是很棒的。

+0

簡單測試找出來:http://jsfiddle.net/fkling/NDvWh/ –

回答

3

這要看情況。 Ajax調用通常是異步的,這意味着代碼的執行不會暫停,直到異步函數返回。因此警報將立即執行。

JavaScript中的異步函數通常用於處理Ajax並從遠程服務器加載某些東西。如果您希望在加載該內容時強制JavaScript等待,那麼您可以爲XMLHTTPRequest對象設置一個標誌。

,這是一個很好的問題爲:When is JavaScript synchronous?

2

它會在ajax調用後立即觸發。如果你想讓它等待回調函數。

編輯:定義一個回調的方法基本上是這樣的:

function(param1, callback) { 
    // do stuff 
    callback(); // execute callback 
} 
0

首先,當你說

的ajaxMethod(),可以說是一些 一種在外部 的Java文件中定義的方法

我想你真的是指外部的JavaScript文件。

當您發送Ajax請求時,請求瀏覽器爲您發送請求到服務器。 服務器上的此請求可能需要一段時間,您不希望「等待」它。 (這是異步請求的全部概念 - 在後臺的東西)。
所以你告訴瀏覽器,在這裏發送這個請求到服務器。除非服務器響應,否則不要打擾我,一旦服務器響應(我們有「響應」),請調用此方法。這被稱爲回調。這個方法稍後會在響應來臨時調用。

所以

x.ajaxMethod(param1,JScallBackFunction); 

聲明(假設它得到一個XMLHttpRequest,初始化並調用它* send方法)實際上做了兩兩件事:

  1. 發送Ajax請求
  2. 註冊一個回調函數,當服務器響應時(當我們有響應時)將會調用它。當服務器有響應時將會調用JScallBackFunction

但由於這是一個異步請求,瀏覽器不會「等待」,而是繼續執行Ajax調用後的下一個語句(如果有的話)並執行它。

因此,alert("Line after ajaxMethod");將立即執行。

*如果這對你沒有任何意義,這就是Ajax請求實際「創建」和「發送」的方式。 This article可能會幫助你理解。

+0

Thx很詳細的回覆... 2件事; 1)。 ajaxMethod()實際上是在.java文件中定義的,通過DWR,我在JS中調用它...不確定純AJAX是否有能力做這件事情,或者我們總是需要DWR或其他東西來調用特定的Java方法在JS內。 2)如果我只是使用obj.open(「GET」,url,false)進行「同步」AJAX請求;在這種情況下,下一行代碼將等待Java方法和JS回調的完整執行,然後再觸發警報。我明白AJAX的目的是爲了異步...但僅僅瞭解... – testndtv

+0

1.是的,你需要像DWR這樣的東西來以你所顯示的方式調用JS中的Java方法。 「傳統上」JS方法會向服務器提交請求,服務器會將其轉發給servlet。藉助DWR,這變得更容易。 2.如果您發出同步Ajax請求,所有其他Javascript將「等待」此請求以完成。所以在這種情況下,回調將被調用,然後警報將被調用。 – Nivas

+0

Ok..cool..thx很多爲您的答覆..它確實非常有用... – testndtv