En el último número, discutimos el diseño del componente de administración de colas y le dimos un nombre llamativo y único: Smart Queue. Esta vez, pondremos en práctica los resultados del diseño anterior y lo implementaremos con código.
Primero, debemos considerar el diseño del archivo fuente, es decir, decidir cómo dividir el código en archivos independientes. ¿Por qué hacer esto? ¿Recuerda que al final del último número mencioné que este componente utilizará "código externo"? Para distinguir el propósito del código, se decidió dividir el código en al menos dos partes: el archivo de código externo y el archivo Smart Queue.
Diferenciar propósitos es solo uno y, en segundo lugar, dispersarlos en archivos independientes es beneficioso para el mantenimiento del código. Imagine que un día en el futuro decide agregar algunas funciones extendidas nuevas a las funciones básicas existentes de administración de colas, o empaquetarlas en un componente que implementa una tarea específica, pero desea mantener las funciones existentes (implementación interna) y llamar El método (interfaz externa) permanece sin cambios, entonces la mejor opción es escribir el nuevo código en un archivo separado.
Bueno, la próxima vez nos centraremos en el tema del diseño de archivos, vayamos al grano. El primer paso, por supuesto, es crear su propio espacio de nombres para el componente. Todo el código del componente estará restringido a este espacio de nombres de nivel superior:
var SmartQueue = ventana.SmartQueue ||
SmartQueue.versión = '0.1';
Durante la inicialización, si encuentra un conflicto de espacio de nombres, deténgalo y úselo. Por lo general, este conflicto es causado por referencias repetidas al código del componente, por lo que "detener" reescribirá el objeto con la misma implementación, en el peor de los casos, si hay otro objeto en la página también llamado SmartQueue, eso es vergonzoso, lo haría; anule su implementación: si no hay más conflictos de nombres, básicamente los dos componentes pueden ejecutarse sin incidentes. También asígnele un número de versión.
A continuación, cree tres colas para SmartQueue según tres prioridades:
var Q = SmartQueue.Queue = [[], [], []];
Cada uno es una matriz vacía porque aún no se han agregado tareas. Y, por cierto, cree un "atajo" para ello. Si desea acceder a la matriz más tarde, simplemente escriba Q[n].
A continuación, nuestra Tarea protagonista hace una gran aparición: aquí se define cómo crear una nueva Tarea:
No entraré en detalles específicos con los comentarios necesarios. Generalmente nuestro código puede ser autodescriptivo y lo mismo ocurre con los códigos posteriores. Aquí le decimos al cliente (usuario): si desea crear una nueva instancia de SmartQueue.Task, debe pasar al menos un parámetro a este constructor (los últimos tres se pueden omitir para el procesamiento predeterminado); de lo contrario, se generará una excepción.
Pero esto no es suficiente. A veces, los clientes quieren clonar una nueva instancia de una Tarea existente, o reparar un "cuerpo sano" (una instancia de objeto de Tarea real) a partir de un "cuerpo deshabilitado" (un objeto con algunos atributos de Tarea), mediante. El método de construcción anterior es un poco incómodo: el cliente tiene que escribir así:
var tarea1 = nueva SmartQueue.Task(obj.fn, 1, '', obj.dependencies);
Fuente: Alipay UED
var T = SmartQueue.Task = función (fn, nivel, nombre, dependencias) {
if(tipo de fn!== FUNCIÓN) {
throw new Error('Tipo de argumento no válido: fn.');
}
this.fn = fn;
this.level = _validateLevel(nivel) nivel: LEVEL_NORMAL;
// detecta el tipo de nombre
this.name = tipo de nombre === STRING && nombre nombre: 't' + _id++;
// las dependencias se pueden recuperar como un 'Objeto', por lo tanto, utilice instancia de en su lugar.
this.dependencies = dependencias instancia de Array dependencias: [];
};