В прошлом году несколько проектов должны были использовать JavaScript для блокировки, поэтому я написал несколько подобных, один из которых:
Код кода копирования следующим образом:
// опубликовано Indream Luo
// intal: [email protected]
// Версия: Китайский 1.0.0
!
window.indream = window.indream || {};
$ .indream = indream;
indream.async = {
//
//Замок
// блокировка: количество замков
// Действие: способ выполнения после разблокировки
//
Lock: function (Lock, Action) {
$ .indream.async.waitings [lock] = $ .indream.async.waitings [lock] || [];
$ .indream.async.waitings [lock] .push (action);
// Если блокировка не используется, текущее действие блокирует блокировку
if (! $. indream.async.lockstatus [lock] && action) {
$ .indReam.async.lockstatus [lock] = true;
if (arguments.length> 2) {{{
var args = 'аргументы [2]';
for (var i = 3; i <arguments.length; i ++) {
args + = ', аргументы [' + i + ']';
}
Eval ('$. Indream.Async.Action.call (action,' + args + ')');
} Еще {
$ .indream.async.action.call (action);
}
}
},
//
// разблокировать
// блокировка: количество замков
//
ReleaseLock: function (lock) {
$ .indream.async.waitings [lock] .shift ();
// Если очередь ожидания является объектом, очередь ожидания выполняется, в противном случае разблокируется
if ($ .indream.async.waitings [lock] .length) {
$ .indream.async.waitings [lock] [0] ();
} Еще {
$ .indream.async.lockstatus [lock] = false;
}
},
//
// Статус блокировки
//
LockStatus: [],
//
// В ожидании завершения мероприятия
// блокировка: кодирование блокировки, то же кодирование будет интегрировано в последовательность, запускающую
//
Подождите: function (Lock, Action) {
$ .indream.async.waitings [code] = $ .indream.async.waitings [code] || [];
$ .indream.async.waitings [code] .push (action);
},
//
// В ожидании последовательности
//
ожидания: [],
//
// кеш данных
//
ДЕЙСТВИЕ: {
//
// Связанные методы мониторинга и обратного вызова
//
перезвонить: {
//
// монитор
//
Слушайте: function (actionName, обратный вызов) {
var list = $ .indream.async.action.calllback.list;
Список [ActionName] = список [ActionName] || [];
список [actionName] .push (обратный вызов);
},
//
//
//
Call: function (actionName, args) {
var list = $ .indream.async.action.calllback.list;
if (list [actionName] && list [actionName] .length) {
для (var i in list [actionname]) {
$ .indReam.async.Action.call (список [ActivityName] [i], args);
}
}
},
//
// существующий список обратных вызовов
//
Список: []
},
//
// существует ли метод и существует ли параметр для выбора соответствующего метода выполнения
//
Call: function (action) {
if (action) {
if (arguments.length> 1) {{{
var args = 'аргументы [1]';
for (var i = 2; i <arguments.length; i ++) {
args + = ', аргументы [' + i + ']';
}
Eval ('action (' + args + ')');
} Еще {
действие ();
}
}
}
}
}
} (window.jquery);
Несколько элементов взаимной блокировки:
• Заблокировать и разблокировать
• Ожидание очереди
• Метод выполнения
Использование приведенных выше замков:
Код кода копирования следующим образом:
// Определите имя блокировки
var lock = 'scrolltop ()';
// Использование блокировки
$ .indReam.async.lock (lock, function () {{) {
var scrolltop = $ (окно).
var таймер;
varufllime = 100;
for (timer = 0; таймер <= полный рабочий день; таймер += 10) {
setTimeout ('$ (window). scrolltop (' + (scrolltop * (vertime -timer) / fulltime) + ');', timer);
}
// Отпустите блокировку
setTimeout ('$. indream.Async.ReleaseLock ("' + lock + '");', полный рабочий день);
});
Что касается реализации этого времени, кратко объясните.
-Полности или количество сигнала спинового блокировки
JavaScript не имеет функции блокировки, поэтому замки реализуются на высоких уровнях.
Согласно принципу javaScript Single -Thread, ресурсы JS очень ограничены, и он не подходит для использования спиновых замков, поэтому я решил использовать Semaphore.
Самоупонентный замок примерно такой, конечно, сделайте, в то время как более полезный:
Код кода копирования следующим образом:
While (true) {
// Сделай что -нибудь ...
}
Это неизбежно воспользоваться полным потоком. Конечно, при необходимости вы можете выбрать комбинацию SetInterval и ClearInterval для его достижения, и эффект будет хорошим.
Метод количества сигнала здесь прост, и принцип прост, так же короткий, как код. Порядок работы примерно:
• Толкните сегмент кода (действие обратного вызова) в очередь ожидания
• Определите, удерживается ли текущий замок.
• Когда блокировка выпускается, следующая регулировка передается в очередь ожидания, а замок передается и выполнена
-В автоматического выпуска или ручного выпуска
Наиболее удобным способом, конечно, является автоматически выпущенное при выполнении текущей программы, но это нелегко, потому что больше ситуаций необходимо настроить выпуск сцены.
То, что используется сама по себе, является асинхронным методом, поэтому обычно появляется другое асинхронное содержимое, такое как анимация Ajax и jQuery. В настоящее время автоматический выпуск не отвечает требованию, потому что на самом деле реальное «исполнение» заключается в том, что после асинхронного обратного вызова в нем, то есть, в основном, только разработчики могут понять себя, поэтому они решили выпустить его здесь.
Тем не менее, есть все еще дефекты, то есть повторный выпуск.
Можно видеть, что все объекты блокировки являются общедоступными или что все объекты JS являются публичными, если локальная переменная не изолирована на уровне доступа. Тем не менее, сама «блокировка» является общественным ресурсом, поэтому нет способа справиться с ним.
Оптимизация, которая может быть сделана здесь, должна быть блокировками с общедоступным именем блокировки, такими как SetInterval и ClearInterval, и разблокировка с частными идентификаторами блокировки может предотвратить повторный выпуск. Тем не менее, в старом коде, выше, не существует, что он будет использоваться в ближайшее время.