2010-06-21 58 views
2

我有一個網頁,我需要用戶點擊保存按鈕,將表單的內容保存到網絡服務器。如何在同步代碼中獲得對異步響應的訪問?

保存的一部分是檢查可能需要提示給用戶的項目,以便他們確認,編輯和重新排列JavaScript彈出窗口中的項目。

如果需要提示,我需要能夠訪問用戶的響應,即點擊確認或取消按鈕,如果單擊取消按鈕,必須停止保存過程,如果確認被點擊按鈕保存過程必須繼續:

同步行爲

的僞代碼:

function SaveData() 
{ 

    if (itemsRequireValidation) 
    { 
     if (RESPONSE_CANCEL == ConfirmationDialog.Show()) { 
      return; 
     } 
    } 

    ProcessConfirmData(ConfirmationDialog.OutputData); 

    //...Do the rest of the save process 
} 

鑑於:

  • 的confir mation對話框是一個Javascript對象,它構建了一些HTML輸出,並且通過這樣的事實引入了異步行爲,即在用戶單擊對話框中包含的確認按鈕或取消按鈕之前,我們無法真正繼續該過程。

  • 阻止代碼使Javascript等待,直到用戶單擊其中一個或另一個將會有消極行爲,可能會導致瀏覽器崩潰或阻止用戶單擊任一按鈕。

我怎麼能去重構這個要考慮到一個事實,即對話框本質上是異步的,但我需要處理用戶的交互就好像它是同步?

我覺得我只是需要從另一個角度來看待這個,現在我沒有看到。

回答

4

使用回調。讓你的ConfirmationDialog允許回調函數作爲選項,它可以在用戶響應時調用這些函數。

function SaveDate() { 

    function HandleSave() { 
    // process rest of save 
    } 
    if (itemsRequireValidation) 
    { 
    ConfirmationDialog.Show({ 
     RESPONSE_CANCEL: function() { 
     // cancelled, do nothing 
     }, 
     RESPONSE_OK: function(output) { 
     ProcessConfirmData(output); 
     HandleSave(); 
     } 
    }); 
    } else { 
    HandleSave(); 
    } 
} 
+0

我缺少的一點是,對話可能不需要叫重做...那麼什麼? – BenAlabaster 2010-06-21 15:40:31

+0

噢,我想我剛剛接觸到了,我傳遞了RESPONSE_OK方法的「保存」函數,但是如果對話框沒有被調用,我就直接調用save函數。讓我變傻......必須是週一早上:P – BenAlabaster 2010-06-21 15:41:49

+0

@BenAlabaster - 對不起,正在擴大我的答案,因爲你在評論 - 這看起來是正確的? – gnarf 2010-06-21 15:42:08

1

我不明白爲什麼對話將是異步的。我想我真的不明白你在問什麼。在我看來,這很簡單:

  1. 用戶點擊SAVE
  2. 節省例行檢查驗證
  3. 如果需要的話,會產生彈出
  4. ,保存被放棄(沒有任何異步)
  5. 當用戶確認彈出窗口中的選擇,或不需要彈出窗口時,然後啓動AJAX的東西。

除非你是做驗證服務器端,在這種情況下,

  1. 用戶點擊SAVE
  2. 驗證程序啓動AJAX,成功回調,讓我們說,validationResponse
  3. validationResponse得到迴應說是否保存成功,或需要進一步編輯
  4. 如果沒有,你完成,東西保存
  5. 如果進一步修改是必要的,給用戶一個機會
  6. 當用戶確認的編輯,從第2步
+0

'popup'很可能是在HTML中添加到文檔中時處理的。等待用戶點擊某個HTML元素將會是異步的,因爲它只會在稍後的事件中被調用。當然,如果他們使用醜陋的JavaScript'confirm()'彈出窗口,則它是同步的。 – gnarf 2010-06-21 15:47:45

+0

@gnarf你的第一個假設是正確的,我同意,confirm()彈出窗口很醜。我不惜一切代價避免這種情況發生,甚至沒有將它用於基本的確認/取消(在這種情況下,它已經遠遠超出了這一點)。 – BenAlabaster 2010-06-21 15:53:30

+0

當然這很醜陋,甚至沒有提出這個建議。是,如果你顯示編輯窗口,你不再保存 - 現在保存被放棄,直到用戶提交新的表單,那時你開始一個新的異步循環。 – Amadan 2010-06-21 22:39:48