El año pasado, varios proyectos debían usar JavaScript para bloquear, así que escribí algunos similares, uno de los cuales:
Copiar código del código de la siguiente manera:
// Publicado por Indream Luo
// Contal: [email protected]
// versión: chino 1.0.0
!
Window.Indream = Window.Indream || {};
$ .Endream = indream;
indream.async = {
//
//Cerrar
// bloqueo: el número de la cerradura
// Acción: la forma de ejecutar después de desbloquear
//
LOCK: function (bloqueo, acción) {
$ .indream.async.waitings [bloqueo] = $ .indream.async.waitings [bloqueo] ||
$ .indream.async.waitings [bloqueo] .push (acción);
// Si no se usa el bloqueo, la acción actual bloquea el bloqueo
if (! $. indream.async.lockstatus [bloquear] && action) {
$ .indream.async.lockstatus [bloqueo] = true;
if (argumentos.length> 2) {{
var args = 'argumentos [2]';
para (var i = 3; i <arguments.length; i ++) {
args + = ', argumentos [' + i + ']';
}
Eval ('$. Indream.async.Action.call (acción,' + args + ')');
} Demás {
$ .indream.async.action.call (acción);
}
}
},
//
// desbloquear
// bloqueo: el número de la cerradura
//
ReleasElock: function (Lock) {
$ .indream.async.waitings [bloqueo] .hift ();
// Si la cola de espera es objeto, la cola de espera se ejecuta, de lo contrario desbloquear
if ($ .indream.async.waitings [bloqueo] .length) {
$ .indream.async.waitings [bloqueo] [0] ();
} Demás {
$ .indream.async.lockstatus [bloqueo] = falso;
}
},
//
// Bloquear el estado
//
Lockstatus: [],
//
// esperando que el evento complete
// Bloqueo: codificación de bloqueo, la misma codificación se integrará en una secuencia, activando
//
Esperar: función (bloquear, acción) {
$ .indream.async.waitings [código] = $ .indream.async.waitings [código] ||
$ .indream.async.waitings [código] .push (acción);
},
//
// esperando la secuencia
//
esperas: [],
//
// caché de datos
//
ACCIÓN: {
//
// Métodos relacionados para monitoreo y devolución de llamada
//
llamar de vuelta: {
//
//monitor
//
Escuchar: function (ActionName, Callback) {
var list = $ .indream.async.action.calllback.list;
Lista [ActionName] = List [ActionName] ||
lista [ActionName] .push (devolución de llamada);
},
//
//
//
Call: Function (ActionName, Args) {
var list = $ .indream.async.action.calllback.list;
if (list [actionName] && list [ActionName] .length) {
para (var i en list [actionName]) {
$ .indream.async.action.call (List [ActivityName] [i], args);
}
}
},
//
// La lista de devolución de llamada existente
//
Lista: []
},
//
// si el método existe y si el parámetro existe para elegir el método de ejecución apropiado
//
Llamar: función (acción) {
if (acción) {
if (argumentos.length> 1) {{
var args = 'argumentos [1]';
para (var i = 2; i <arguments.length; i ++) {
args + = ', argumentos [' + i + ']';
}
Eval ('acción (' + args + ')');
} Demás {
acción ();
}
}
}
}
}
} (Window.jquery);
Varios elementos de bloqueo mutuo son:
• Bloquear y desbloquear
• Esperando la cola
• Método de ejecución
Uso de las cerraduras anteriores:
Copiar código del código de la siguiente manera:
// Defina el nombre del bloqueo
var bloquear = 'scrollTop ()';
// usa el bloqueo
$ .indream.async.lock (bloqueo, function () {{) {
var scrolltop = $ (ventana).
temporizador var;
VarfullTime = 100;
for (timer = 0; timer <= Full Time; Timer += 10) {
setTimeOut ('$ (ventana). scrollTop (' + (scrolltop * (full a tiempo completo) / fulltime) + ');', temporizador);
}
// suelta el bloqueo
setTimeout ('$. Indream.async.ReleaseLock ("' + bloqueo + '");', a tiempo completo);
});
Con respecto a la realización de este tiempo, explique brevemente.
-El bloqueo de giro o cantidad de señal
JavaScript no tiene una función de bloqueo, por lo que los bloqueos se implementan en niveles altos.
Según el principio de JavaScript de un solo hilo, los recursos de hilo de JS son muy limitados, y no es adecuado para usar bloqueos de spin, por lo que elegí usar el semáforo.
El bloqueo de sí mismo es más o menos así, por supuesto, mientras que es más útil:
Copiar código del código de la siguiente manera:
While (verdadero) {
// Haz algo ...
}
Esto debe aprovechar inevitablemente el hilo completo. Por supuesto, si es necesario, puede elegir la combinación de SetInterval y ClearInterval para lograrlo, y el efecto será bueno.
El método de la cantidad de señal es simple aquí, y el principio es simple, tan corto como el código. El orden de trabajo es más o menos:
• Empuje el segmento de código (la acción de devolución de llamada) a la cola de espera
• Determine si el bloqueo actual está retenido.
• Cuando se libera el bloqueo, el siguiente ajuste se pasa en la cola de espera, y el bloqueo se pasa y se ejecuta
-En lanzamiento automático o lanzamiento manual
La forma más cómoda es, por supuesto, se lanza automáticamente cuando se ejecuta el programa actual, pero esto no es fácil, porque más situaciones deben personalizar la liberación de la escena.
Lo que se usa en sí mismo es el método asincrónico, por lo que generalmente aparecen otros contenidos asíncronos, como Ajax y JQuery Animation. En este momento, la versión automática no satisface la demanda, porque de hecho, la "ejecución" real es que después de la devolución de llamada asincrónica dentro de ella, es decir, básicamente solo los desarrolladores pueden comprometerse, por lo que eligen liberarla aquí.
Sin embargo, todavía hay defectos, es decir, liberación repetida.
Se puede ver que todos los objetos de bloqueo son públicos, o que todos los objetos de JS son públicos, a menos que la variable local esté aislada en el nivel de acceso. Sin embargo, el "bloqueo" en sí es un recurso público, por lo que no hay forma de lidiar con él.
La optimización que se puede hacer aquí debe ser bloqueadas con un nombre de bloqueo público como SetInterval y ClearInterval, y desbloquear con ID de bloqueo privado puede evitar la liberación repetida. Sin embargo, no hay en el código anterior anterior, se estima que se usará pronto.