Meu trabalho tem sido um pouco mais fácil recentemente. Lembrei -me de uma promessa de palavras que sempre via antes, então fui estudá -la pacientemente.
1: O que é uma promessa? Por que isso está aí?
Primeiro de tudo, o Promise é criado para resolver o problema da redação de código durante a programação assíncrona do JavaScript.
Com o desenvolvimento de JavaScript, há cada vez mais cenários assíncronos. O front -end possui Ajax, Settimeout, etc., e o nó de back -end é assíncrono. De acordo com a prática tradicional, é incorporar retornos de chamada em vários retornos de chamada. O código pode deixar as pessoas tonto.
No momento, a comunidade CommonJS propôs uma especificação chamada Promise/A+, que define como escrever código assíncrono, incluindo o uso de quando/Then/Resolve, etc. para organizar o código assíncrono.
Como essa especificação é muito elegante, muitas pessoas implementaram essa especificação uma após a outra, incluindo a promessa de suporte nativo do navegador (), adiada em jQuery, quando.js, etc.
Como essas bibliotecas atendem a essa especificação, apenas aprenda uma. Aprendi principalmente adiar o jQuery, então este artigo fala principalmente sobre essa implementação.
Dois: JQuery's diferido
Primeiro de tudo, sobre o objeto diferido, o Sr. Ruan Yifeng escreveu um artigo em detalhes, clique aqui. Recomenda -se que você leia o artigo dele primeiro e depois continue lendo.
Como mencionado acima, as promessas são projetadas para resolver assíncronos (como Ajax), então vamos comparar suas diferenças.
O clássico jQuery Ajax está escrito como
A cópia do código é a seguinte:
$ .ajax ({
Tipo: "Get",
url: "",
Sucesso: function () {},
erro; function () {}
});
Os parâmetros de sucesso e erro são funções de retorno de chamada quando sucesso/falha.
Agora o método de escrita do Ajax de JQuery se tornou
A cópia do código é a seguinte:
$ .ajax ({
tipo; "pegar",
URL: ""
}). done (function () {}). Fail (function () {});
Após o sucesso, a função em feita será chamada e, se a função falha for chamada, a função na falha será chamada.
Depois de ver isso, você pode ter dúvidas, qual objeto esses métodos são feitos/falhados? Que objeto $ .ajax () retorna e por que existem esses dois métodos?
A resposta está no objeto diferido introduzido abaixo.
O JQuery fornece um novo tipo de adiamento. Gerar com $ .Deferred (). Por exemplo
A cópia do código é a seguinte:
var def = $ .Deferred ();
Este def herda muitos métodos, incluindo feitos/falhas/resolução/rejeição, etc.
Então, aqui sabemos que o $ .ajax () acima retorna esse objeto.
Existem muitos métodos para objetos diferidos. Aqui estão vários usados comumente. Para mais informações, consulte a API.
A primeira coisa é gerar naturalmente um objeto def. Existem muitas maneiras aqui, como:
A cópia do código é a seguinte:
var def = $ .Deferred (); // Gere você mesmo
$ .ajax ({}); // O método Ajax retorna também um objeto def
$ .When (); // Quando o método também retornará um objeto def
Aqui, $ .hen () pode ser discutido separadamente. Esse método geralmente recebe um ou mais objetos diferidos e, em seguida, determina o estado do objeto retornado por $ .hen () com base no status desses objetos diferidos. Um dos cenários de uso são várias solicitações de Ajax. Se um deles falhar, é considerado uma falha. Em seguida, você pode passar vários métodos AJAX em $. Então $ .Quando retornará um objeto DEF (julgado com base nos resultados dessas duas solicitações).
Em seguida, você obtém o objeto def e há uma série de métodos para alterar o estado desse objeto.
A cópia do código é a seguinte:
def.Resolve (); // Defina o objeto DEF a ser concluído e, em seguida, a função ligada ao def.done () será executada imediatamente.
def.Reject (); // Defina o objeto DEF falhou e, em seguida, a função vinculada ao def.fail () será executada imediatamente.
def.Notify (); // Durante a execução do objeto DEF, o retorno de chamada correspondente é def.Progress ().
Em seguida, é o método de definir o retorno de chamada, o pedido corresponde ao exposto acima, ou seja, o que o Estado chamará para qual retorno de chamada
A cópia do código é a seguinte:
def.done (); // correspondente a def.resolve ();
def.fail (); // correspondente a def.reject ();
def.Progress (); // correspondente a def.Notify ();
// Especial
def.always (); // chamado se bem -sucedido ou falhado
def.then (); // aceita várias funções, em ordem, sucesso, falha e progresso
De fato, neste momento, o uso do objeto diferido é quase o mesmo. No entanto, o jQuery também fornece várias APIs
A cópia do código é a seguinte:
// Verifique a classe de status atual
def.isRejeded ();
def.isResolved ();
def.state ();
Como o nome sugere, essas APIs não serão discutidas em detalhes. Para detalhes, você pode verificar a documentação da API do jQuery fornecida acima.
Existe outro método, que às vezes queremos fornecer um objeto DEF externo e, em seguida, esse objeto pode definir retornos de chamada para vários estados, mas não podemos alterar seu estado, para que possamos usá -lo.
A cópia do código é a seguinte:
def.promise ();
Retorne um objeto Promisee, que é um subconjunto do objeto diferido. Você pode usar o feito/fracasso e outros métodos, sem resolver/rejeitar e outros métodos. É principalmente proteger o estado do objeto DEF de ser modificado de fora.
Neste ponto, todas as promessas foram discutidas. Agora você pode usá -los em seus projetos. Além disso, desejo -lhe um feliz dia os primeiros anos de antecedência. Desejo a todos um feliz ano das ovelhas ^^.