2013-07-02 94 views
0

我有一個Ajax的功能,將發佈數據,然後顯示與OK \問題的mutex_lock相當於在JavaScript

$.ajax({ 
      url: 'save.php', 
      type: "POST", 
      data: jsObj 
      //contentType: "application/json" 
     }) 
     .success(function (result) 
     { 

     var status = result.split(";")[0]; 
     var msg = result.split(";")[1]; 
     if ((status == "Ok") && ($('#divMsg').css('display') == 'none')) 
     { 
      //console.log($('#divMsg').css('display')); 
      $("#divMsg").toggle("slow"); 
      $("#divMsg").find("p").text("Saved"); 
     } 
     (...) 

問題的消息是,它可能會在第二次被調用幾次,所以它會顯示一個div說多次保存。我只想讓它顯示一次。我試着檢查div是否隱藏,但它必須發生得太快,並且它仍然顯示爲可見的下一個消息。

有什麼辦法可以得到一些鎖定機制?

回答

2

JavaScript中的客戶端是單線程的,除非你明確地創建工人的任務(而不是所有的瀏覽器支持)。您可能希望在跟蹤未完成請求數量的地方保留一個變量,並且只在最後一個請求完成時纔打印結果。

保留計數器在你的輸出元素是一個體面的想法,但它應該是一個計數器,而不只是一個真/假的標誌。我假設您可能要一次處理多個請求,並且只有在最後一個請求解決後才顯示結果。

// save the divMsg element, since we're going to use it a few times. 
var divMsg = $("#divMsg"); 
var count = divMsg.data('pendingRequests'); 
divMsg.data('pendingRequests', count ? count+1 : 1); // increment the count, or set it to 1 

$.ajax({ 
    url: 'save.php', 
    type: "POST", 
    data: jsObj 
}).done(function (result) { 
    var status = result.split(";")[0]; 
    var msg = result.split(";")[1]; 
    if ((status == "Ok") && (divMsg.css('display') == 'none')) { 
     // if this is the last request, print the status 
     if (divMsg.data('pendingRequests') == 1) 
      divMsg.toggle("slow").find("p").text("Saved"); 
    } 
    (... etc ...) 
}).always(function(result) { 
    // decrement the pending request count. 
    var count = divMsg.data('pendingRequests'); 
    divMsg.data('pendingRequests', count-1); 
}); 

您也可以添加fail()處理程序,並打印失敗信息。

0

只需使用一個JavaScript對象,並根據您想要的鎖設置它的鍵爲true或false。

var locks = {}; 


    var functionWithMutex = function(){ 
    if(locks['state_name'] == true){ 
      return; 
     } 
    locks['state_name'] = true; 
    ....do some task...then release the lock by setting to false. 
}; 
0

我會建議使用真正的數據存儲,如果是的話。

Ember和ExtJs都有這方面的例子,但可能有獨立的,通常記錄包裹在一個存儲狀態的對象,如isLoaded,isDirty等,可用於僞鎖定記錄,或實現它你自己通過一個對象包裝器。

而且如果數據分辨率是目標檢查

https://github.com/ebryn/bigdata.js