2012-03-01 25 views
0

比方說,例如,我有一個返回布爾javascript函數如下:

function CallWebServiceToUpdateSessionUser(target, user) 
{ 
    var dataText = { "jsonUser": JSON.stringify(user) }; 

    $.ajax({ 
     type: "POST", 
     url: target, 
     data: JSON.stringify(dataText), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (response) 
     { 
      return true; 
     }, 
     failure: function (msg) 
     { 
      return false; 
     } 
    }); 
} 

和被稱爲可能需要在服務器上的目標函數以...... 15秒來回應。

如何保證此功能不會退出,直到服務器調用完成?或者,我怎樣才能保證誰曾經調用這個函數會得到真/假而不是未定義的?

NOTE: 我見過人們使用async:false,但掛起了我不想要的UI。

+0

.ajax()默認是異步的,除非將async設置爲false,否則不會掛起瀏覽器。使用控制檯進行調試會向您顯示什麼?順便說一下,你似乎違背了你的自我,要求在函數完成之前不要讓函數退出,但是你說你不想等待。哪一個? – j08691 2012-03-01 16:46:50

+1

您想讓瀏覽器卡住,直到服務器響應,而不掛斷用戶界面。這是一個矛盾。 雖然瀏覽器卡在你的函數中,但它不能處理其他任何東西。 – 2012-03-01 16:47:26

+0

爲什麼你不希望函數退出?這正是你想要發生的事情,以便再次釋放UI線程。您應該彈出一個「加載」消息,然後從服務器收到響應後恢復工作。可能允許用戶取消響應(或至少忽略結果)。 – 2012-03-01 16:48:14

回答

2

請參閱http://api.jquery.com/jQuery.ajax/。您需要使用async: true參數來執行AJAX請求。然後您需要編輯您的代碼,以便在successful請求後執行的代碼位於successful區塊內。

+0

async默認爲true – j08691 2012-03-01 16:45:00

+0

因此,示例中的代碼將以undefined退出,因爲它沒有等待服務器端函數返回。我必須從服務器接收值才能繼續 – Miles 2012-03-01 16:52:50

+0

如果您想使用異步,那麼您正以錯誤的方式接近。你需要找出另一種設置變量的方法。一種可能的方法是將函數調用後的所有代碼放入成功塊中。目前您無法按照您希望的方式使用代碼功能。 – Bot 2012-03-01 16:59:35