javascript中的互斥锁等价物
我有一个ajax函数,它将发布数据,然后显示带有OK\Problem的消息javascript中的互斥锁等价物,javascript,jquery,Javascript,Jquery,我有一个ajax函数,它将发布数据,然后显示带有OK\Problem的消息 $.ajax({ url: 'save.php', type: "POST", data: jsObj //contentType: "application/json" }) .success(function (result) { var status = result
$.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,说saved multiples。我只想让它展示一次。我试着检查div是否被隐藏,但它必须发生得太快,并且在接下来的消息中仍然显示为可见
有什么方法可以获得某种锁定机制吗?只需使用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.
};
客户端中的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()
处理程序,并打印故障信息。如果是这样,我建议使用真正的数据存储
Ember和ExtJs都有这样的例子,但可能有独立的记录,通常记录被包装在一个存储状态的对象中,如isLoaded、isDirty等,可以用于伪锁定记录,或者通过对象包装器自己实现
此外,如果数据解析是一个目标,请检查