2012-02-29 90 views
1

我正在向現有功能添加一些功能。我需要在當前例程中插入一個額外的步驟。我知道如何去第二個函數,但是我不知道如何在第二個例程完成後返回主函數。如何編寫一個JS函數來執行某些操作,然後在該過程完成後返回?

function step1(){ 
    perform ajax call to see if student is assigned to a project 
    step1_subfunction() 
    // wait here until step1_subfunction is done 
    do some more stuff with response from user 
} 

function step1_subfunction(){ 
    prompt user via jQuery dialog, 'Add or move employee to the project?' 
    // return to step1 with answer returned from user and resume 
} 

我會谷歌這個,但我不知道這個「過程」是否有一個名稱。回到COBOL的日子裏,我們稱之爲gosub。

更新: 步驟1執行ajax調用以查看員工是否已分配給項目。如果response.status ='Assigned',則用戶將通過jQuery對話框「您想要將員工複製或移動到該項目嗎?」來詢問用戶。 jQuery對話框將是step1_subroutine。答案將被傳回給step1函數。 step1的其餘部分僅僅是將一個值放置在「複製」或「移動」的隱藏文本字段中。

+1

只要'step1_subfunction'不執行任何異步代碼,這就是它的工作原理 – scibuff 2012-02-29 17:07:51

+0

@scibuff像偶然的ajax調用一樣長? – HPWD 2012-02-29 17:11:05

+0

@dlackey:是的。它'step1_subfunction'包含一個AJAX調用,這是行不通的。 – 2012-02-29 17:12:00

回答

0

你有什麼將執行你正在描述的內容,但可能不會使用戶的數據可用於執行step1()函數,而不會返回函數step1_subfunction()。下面我修改了你的示例代碼來演示返回值的傳遞。

function step1(){ 
    //do some stuff 
    var returnValFromFunction = step1_subfunction(); 
    // wait here until step1_subfunction is done 
    // Now use returnValFromFunction, it contains the information from the user 
    do some more stuff with response from user 
} 

function step1_subfunction(){ 
    prompt user for some information 
    // return to step1 with information returned from user and resume 
    return userResponse; 
} 
+0

我讀到了使用「返回」,這看起來是我所需要的。謝謝,@波 – HPWD 2012-02-29 18:47:33

0

你寫的東西應該可以工作 - javascript是單線程的,所以你試過了嗎?

Javascript沒有專門的子程序,只是創建一個返回並忽略結果的函數,就像你所做的那樣。當第二個例程完成時,範圍和執行將在第一個函數中繼續。

+0

我寫出了骨架,它/出現/是單線程的,但在我開始調整這個現有的過程之前,我想確認我的邏輯是正確的。 – HPWD 2012-02-29 17:12:06

0

什麼都不做。

你正在努力實現只是一個「函數調用」

所以它會自動返回到它的調用者「堆棧幀」執行一次。

0

您可以使ajax對象同步 - IE,代碼將繼續,直到它得到一個響應。這是open的第三個參數(true是異步的,false是同步的)。

xmlhttpobject.open('POST', 'url', false); 

有些情況下同步呼叫很好,但應儘量避免。

另一種替代方法,可能需要在代碼中進行一些邏輯更改,但從長遠來看最好,是綁定onReadyStateChange事件。這會在每次xmlHttpRequest對象的狀態發生更改時觸發 - 您可以檢查狀態是否爲200,readystate是否爲4以確保請求已成功完成併成功完成。

Here's更好的參考。祝你好運。

相關問題