Na última edição, discutimos o design do componente de gerenciamento de filas e demos a ele um nome alto e exclusivo: Smart Queue. Desta vez, vamos colocar em prática os resultados do design anterior e implementá-los com código.
Primeiro, precisamos considerar o layout do arquivo fonte, ou seja, decidir como dividir o código em arquivos independentes. Por que fazer isso? Lembra que no final da edição passada mencionei que esse componente usará "código externo"? Para distinguir a finalidade do código, optou-se por dividir o código em pelo menos duas partes: o arquivo de código externo e o arquivo Smart Queue.
Diferenciar propósitos é apenas um e, segundo, dispersá-los em arquivos independentes é benéfico para a manutenção do código. Imagine que um dia no futuro você decida adicionar algumas novas funções estendidas às funções básicas existentes de gerenciamento de filas, ou empacotá-las em um componente que implemente uma tarefa específica, mas deseja manter as funções existentes (implementação interna) e chamar método (interface externa) permanecem inalterados, então escrever o novo código em um arquivo separado é a melhor escolha.
Bem, da próxima vez vamos nos concentrar no tópico layout de arquivos, agora vamos direto ao ponto. O primeiro passo, claro, é criar seu próprio namespace para o componente. Todo o código do componente será restrito a este namespace de nível superior:
var SmartQueue = janela.SmartQueue ||
SmartQueue.version = '0.1';
Durante a inicialização, se você encontrar um conflito de namespace, puxe-o e use-o. Geralmente esse conflito é causado por referências repetidas ao código do componente, então "pull over" irá reescrever o objeto com a mesma implementação, na pior das hipóteses, se houver outro objeto na página também chamado SmartQueue, isso seria constrangedor; substitua sua implementação - se não houver mais conflitos de nomenclatura, basicamente os dois componentes poderão ser executados sem incidentes. Forneça também um número de versão.
A seguir, crie três filas para SmartQueue de acordo com três prioridades:
var Q = SmartQueue.Queue = [[], [], []];
Cada um é um array vazio porque nenhuma tarefa foi adicionada ainda. E por falar nisso, crie um "atalho" para ele. Se quiser acessar o array mais tarde, basta escrever Q[n].
A seguir, nosso protagonista Task faz uma grande aparição - como criar uma nova Task é definido aqui:
Não entrarei em detalhes específicos com os comentários necessários, geralmente nosso código pode ser autodescritivo, e o mesmo se aplica aos códigos subsequentes. Aqui dizemos ao cliente (usuário): Se você deseja criar uma nova instância SmartQueue.Task, você deve passar pelo menos um parâmetro para este construtor (os três últimos podem ser omitidos para processamento padrão), caso contrário uma exceção será lançada.
Mas isso não é suficiente. Às vezes, os clientes desejam clonar uma nova instância de uma tarefa existente ou reparar um "corpo íntegro" (uma instância real do objeto Task) de um "corpo desativado" (um objeto com alguns atributos de tarefa), por meio de O método de construção acima é um pouco desconfortável - o cliente tem que escrever assim:
var tarefa1 = novo SmartQueue.Task(obj.fn, 1, '', obj.dependencies);
Fonte: Alipay UED
var T = SmartQueue.Task = function(fn, nível, nome, dependências) {
if (tipo de fn! == FUNÇÃO) {
throw new Error('Tipo de argumento inválido: fn.');
}
isto.fn = fn;
this.level = _validateLevel (nível)? nível: LEVEL_NORMAL;
// detecta o tipo de nome
this.name = typeof nome === STRING && nome : 't' + _id++;
// dependências podem ser recuperadas como um 'Objeto', então use instanceof.
this.dependencies = dependências instanceof Array dependências: [];
};