這篇文章主要介紹了簡單的JavaScript互斥鎖的相關資料,需要的朋友可以參考下
去年有幾個項目需要使用JavaScript互斥鎖,所以寫了幾個類似的,這是其中一個: 復制代碼 代碼如下: //Published by Indream Luo //Contact: [email protected] //Version: Chinese 1.0.0 !function ($) { window.indream = window.indream || {}; $.indream = indream; indream.async = { // //鎖 //lock: 鎖的編號 //action: 解鎖後執行的方法 // lock: function (lock, action) { $.indream.async.waitings[lock] = $.indream.async.waitings[lock] || []; $.indream.async.waitings[lock].push(action); //如果該鎖未被使用,則當前action阻塞該鎖 if (!$.indream.async.lockStatus[lock] && action) { $.indream.async.lockStatus[lock] = true; if (arguments.length > 2) { var args = 'arguments[2]'; for (var i = 3; i < arguments.length; i++) { args += ', arguments[' + i + ']'; } eval('$.indream.async.action.call(action, ' + args + ')'); } else { $.indream.async.action.call(action); } } }, // //解鎖 //lock: 鎖的編號 // releaseLock: function (lock) { $.indream.async.waitings[lock].shift(); //如果等待隊列有對象,則執行等待隊列,否則解鎖 if ($.indream.async.waitings[lock].length) { $.indream.async.waitings[lock][0](); } else { $.indream.async.lockStatus[lock] = false; } }, // //鎖的狀態 // lockStatus: [], // //等待事件完成 //lock:鎖編碼,相同的編碼將被整合成一個序列,觸發時同時觸發 // wait: function (lock, action) { $.indream.async.waitings[code] = $.indream.async.waitings[code] || []; $.indream.async.waitings[code].push(action); }, // //等待序列 // waitings: [], // //數據緩存 // action: { // //監聽和回調的相關方法 // callback: { // //監聽 // listen: function (actionName, callback) { var list = $.indream.async.action.callback.list; list[actionName] = list[actionName] || []; list[actionName].push(callback); }, // //回調 // call: function (actionName, args) { var list = $.indream.async.action.callback.list; if (list[actionName] && list[actionName].length) { for (var i in list[actionName]) { $.indream.async.action.call(list[actionName][i], args); } } }, // //現有的回調列表 // list: [] }, // //根據方法是否存在和參數是否存在選擇適當的執行方式 // call: function (action) { if (action) { if (arguments.length > 1) { var args = 'arguments[1]'; for (var i = 2; i < arguments.length; i++) { args += ', arguments[' + i + ']'; } eval('action(' + args + ')'); } else { action(); } } } } } }(window.jQuery); 一個互斥鎖的幾個元素是: •鎖與解鎖 •等待隊列 •執行方法 以上鎖的用法: 復制代碼 代碼如下: //定義鎖的名稱 var lock = 'scrollTop()'; //使用鎖 $.indream.async.lock(lock, function () { var scrollTop = $(window).scrollTop(); var timer; var fullTime = 100; for (timer = 0; timer <= fullTime; timer += 10) { setTimeout('$(window).scrollTop(' + (scrollTop