A interação das páginas da web está se tornando cada vez mais complexa, e o JavaScript também está se tornando cada vez mais operações assíncronas. Por exemplo, uma solicitação comum de Ajax requer resposta às operações quando a solicitação é concluída. A solicitação geralmente é assíncrona. Durante o processo de solicitação, o usuário pode executar outras operações sem bloquear a página. Esse efeito de interação assíncrono é bastante amigável para o usuário. Mas para os desenvolvedores, é muito hostil lidar com esse tipo de operação em grandes quantidades. As operações concluídas por solicitações assíncronas devem ser predefinidas na função de retorno de chamada, e essa função deve ser chamada após a conclusão da solicitação. Esse método de programação assíncrono não linear deixará os desenvolvedores desconfortáveis e também traz muitos inconvenientes, aumentando o acoplamento e a complexidade do código, e a organização do código será muito deselegante, reduzindo bastante a manutenção do código. A situação é mais complicada. Se uma operação tiver que esperar até que várias solicitações assíncronas de Ajax sejam concluídas antes que possam ser executadas, a função de retorno de chamada será aninhada. Se várias camadas precisarem ser aninhadas, você só pode pedir bênçãos.
Vamos dar uma olhada nas seguintes funções assíncronas comuns.
A cópia do código é a seguinte:
var showsg = function () {
setTimeout (function () {
alerta ('olá');
}, 5000);
};
Isso geralmente é feito se você deseja adicionar um retorno de chamada à função.
A cópia do código é a seguinte:
var showsg = function (retorno de chamada) {
setTimeout (function () {
alerta ('olá');
// Adicione o retorno de chamada aqui
ligar de volta();
}, 5000);
};
Se você usar o Easy.js, o método de adicionar retornos de chamada será muito mais elegante, desde que você precise encapsular a função original em uma instância de promessa.
A cópia do código é a seguinte:
var showsg = function () {
// Construa a instância da promessa
var promete = new e.promise ();
setTimeout (function () {
alerta ('olá');
// muda o estado de promessa
promete.resolve ('feito');
}, 5000);
// retorna à instância da promessa
promessa de retorno;
};
Existem 3 etapas principais para encapsular uma função comum em uma instância de promessa. O primeiro passo é construir uma instância de promessa dentro da função. A segunda etapa é alterar o estado da promessa a ser concluído após a execução da função de implantação. O terceiro passo é retornar esta instância da promessa. Cada instância da promessa possui três estados, ou seja, pendente (não concluído), resolvido (concluído, bem -sucedido) e rejeitado (rejeitado, falhou). Vamos dar uma olhada em como adicionar retornos de chamada.
A cópia do código é a seguinte:
showmsg (). Então (função (str) {
// O retorno de chamada é adicionado aqui
retorno de chamada (STR);
});
Isso separa completamente a função de retorno de chamada da função assíncrona original e, da perspectiva da organização de código, é muito mais elegante. Resolve aceita um parâmetro que pode transferir facilmente dados para o retorno de chamada adicionado usando o método então.
Para solicitações do AJAX, o Easy.js encapsula diretamente o método AJAX em um objeto Promise e você pode adicionar diretamente o método então para retornar.
A cópia do código é a seguinte:
E.AJAX ({
URL: 'test1.php',
Tipo: 'Get'
})
.then (function () {
// Adicione um retorno de chamada com solicitação bem -sucedida
}, function () {
// Adicione um retorno de chamada que falhou solicitação
});
O método então aceita 2 funções como parâmetros. A primeira função é um retorno de chamada concluído e o segundo é um retorno de chamada com falha.
E se houver várias solicitações de Ajax mencionadas acima? Então você deve usar o método quando. Este método pode aceitar várias instâncias de promessa como parâmetros.
A cópia do código é a seguinte:
var solicitações = e.when (e.ajax ({
URL: 'test1.php',
Tipo: 'Get'
}), E.ajax ({
URL: 'test2.php',
Tipo: 'Get'
}));
solicitações.Then (function (arg1, arg2) {
console.log ('Sucesso:' + arg1 [0] + arg2 [0]);
}, função (arg1, arg2) {
console.log ('falha:' + arg1 + arg2);
});
O método quando é armazenar várias instâncias de promessa em uma matriz e aguarde até que todas as instâncias da promessa da matriz sejam concluídas antes de executar o retorno de chamada preenchido. Depois que uma instância é rejeitada, o retorno de chamada rejeitado é executado imediatamente.
O padrão de promessa é uma das especificações dos Commonjs. Muitas bibliotecas JavaScript convencionais têm implementações correspondentes, como jQuery e dojo, que adiaram para implementar essas funções. Aqui ainda quero reclamar do adiado de JQuery. Deixando de lado seu uso interno, este deve ser o módulo com a menor taxa de uso do usuário, que tem um certo relacionamento com seu método de uso mais complexo.