0

我有一个 ajax 函数,它将发布数据,然后显示一条带有 OK\Problem 的消息

$.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 是否被隐藏,但它必须发生得太快,并且对于下一条消息它仍然显示为可见。

有什么办法可以得到一些锁定机制?

4

3 回答 3

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()处理程序,并打印失败信息。

于 2013-07-02T23:37:44.617 回答
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.
};
于 2013-07-02T19:01:47.017 回答
0

如果是这样,我建议使用真实的数据存储。

Ember 和 ExtJs 都有这样的例子,但是可能有独立的,通常记录被包装在一个存储状态的对象中,如 isLoaded、isDirty 等,可以用于伪锁定记录,或者通过对象自己实现包装。

此外,如果数据解析是目标,请查看

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

于 2013-07-03T00:02:08.380 回答