Suponha que um cenário de negócios:
Através do endereço RSS, obtenha o RSS e salve -o no arquivo, e o endereço RSS é salvo no arquivo.
Para concluir o negócio nesse cenário, são necessárias três tarefas:
1. Leia o endereço RSS do arquivo.
2. Obtenha RSS.
3. Salvar no arquivo.
Finalmente, essas três tarefas são integradas.
Preparar:
Arquivos que armazenam endereço RSS, endereço.txt.
http://programmer.csdn.net/RSS_Progrmer.html
Tarefa 1:
Leia o conteúdo do arquivo de endereço RSS e retorne via retorno de chamada.
A cópia do código é a seguinte:
var getrssaddress = function (caminho, retorno de chamada) {
fs.readfile (caminho, {coding: 'utf8'}, function (err, dados) {
retorno de chamada (err, dados);
});
}
Tarefa 2:
Chegue ao RSS através do endereço RSS e retorne erros ou dados por retorno de chamada.
A cópia do código é a seguinte:
var getrss = function (url, retorno de chamada) {
var dados = '';
http.get (url, function (res) {
res.on ('dados', função (chrunk) {
dados += chrunk;
});
res.on ('end', function () {
retorno de chamada (nulo, dados);
});
}). on ('erro', function (err) {
retorno de chamada (err, nulo);
});
}
Tarefa 3:
Salve o RSS em um arquivo e retorne um erro por retorno de chamada.
A cópia do código é a seguinte:
var saverss = função (dados, retorno de chamada) {
fs.writefile ('rss.txt', dados, 'utf8', function (err) {
retorno de chamada (err);
});
}
Integração:
A cópia do código é a seguinte:
getrssaddress ('endereço.txt', function (err, dados) {
if (err) {
console.log (err);
retornar;
}
getrss (dados, função (err, dados) {
if (err) {
console.log (err);
retornar;
}
Savers (dados, função (err) {
if (err) console.log (err);
});
});
});
O código acima é totalmente o processamento assíncrono. O retorno de chamada mais comum é usado para lidar com o retorno da lógica assíncrona. A vantagem é que o método de escrita padrão é fácil para todos aceitarem; A desvantagem é que o acoplamento é muito forte, o manuseio de exceções é que o código não é intuitivo, especialmente ao lidar com a lógica de negócios complexa e muitas tarefas, os retornos de chamada em camadas farão as pessoas olham para eles e o código é difícil de manter.
Uma das implementações da promessa/uma especificação é quando o.js, que é destinado a um domínio desse problema.
Vamos dar uma olhada no código modificado.
Tarefa 1:
A cópia do código é a seguinte:
var getrssaddress = function (caminho) {
var diferred = when.defer ();
fs.readfile (caminho, {coding: 'utf8'}, function (err, dados) {
if (err) adido.reject (err);
diferred.Resolve (Data);
});
return diferred.promise;
}
Tarefa 2:
A cópia do código é a seguinte:
var getrss = function (url) {
var diferred = when.defer ();
var dados = '';
http.get (url, function (res) {
res.on ('dados', função (chrunk) {
dados += chrunk;
});
res.on ('end', function () {
diferred.Resolve (Data);
});
}). on ('erro', function (err) {
diferred.Reject (err);
});
return diferred.promise;
}
Tarefa 3:
A cópia do código é a seguinte:
var saverss = function (dados) {
var diferred = when.defer ();
fs.writefile ('rss.txt', dados, 'utf8', function (err) {
if (err) adido.reject (err);
diferred.Resolve ();
});
return diferred.promise;
}
Integração:
A cópia do código é a seguinte:
getrssaddress ('endereço.txt')
.TENHEN (GETRSS)
. então (poupadores)
.catch (function (err) {
console.log (err);
});
explicar:
O modelo "diferido/promessa" definido pela promessa/a especificação é o modelo "publicar/assinante". A publicação de eventos através do objeto diferido pode ser um evento de resolução de conclusão ou um evento de rejeição fracassado; As assinaturas concluídas ou falhadas correspondentes são feitas através do objeto Promise.
Nas promessas/uma especificação, cada tarefa possui três estados: padrão (pendente), cumprido (cumprido) e falhou (rejeitado).
1. O estado padrão pode ser transferido para o estado de conclusão em uma direção. Esse processo é chamado de resolução, e o método correspondente é adiado.Resolve (PromoteorValue);
2. O estado padrão também pode ser transferido para o estado fracassado em uma direção. Esse processo é chamado de rejeição, e o método correspondente é adiado.Reject (Motivo);
3. No estado padrão, você também pode declarar informações de execução de tarefas através do adiado.Notify (Update), como o progresso da execução;
4. A transferência de estado é única. Depois que a tarefa mudar do inicial pendente para outros estados, ele entrará no processo de execução da próxima tarefa.
Siga o código acima.
Defina um objeto diferido através de quando.Defer.
var diferred = when.defer ();
Depois que os dados assíncronos são obtidos com sucesso, um evento de conclusão é publicado.
diferred.Resolve (Data);
Após a falha de aquisição de dados assíncronos, um evento fracassado é publicado.
diferred.Reject (err);
E devolver o objeto Promise como uma assinatura.
return diferred.promise;
A assinatura é uma assinatura que é concluída/falhada/notificada através do método do objeto Promise.
getrssaddress ('endereço.txt')
.TENHEN (GETRSS)
Depois, existem três parâmetros, como o Onfulfilled, Onejeded e OnProgress
Promise.Then (Onfulfilled, OnRejeded, OnProgress)
A tarefa anterior é resolve (dados) e a função onfulfilled será acionada e os dados serão usados como seu parâmetro.
Se a tarefa anterior for rejeitada (Razão), será acionado on -rejetado e um motivo será recebido.
A qualquer momento, apenas um dos cumpridos e controlados pode ser acionado e apenas uma vez.
Para lidar com exceções, quando o.js também fornece um método extremamente conveniente. Então pode passar erros. Quando várias tarefas são executadas em série, só podemos definir o ONEjeded no último. Você também pode chamar a função de captura após a última e depois capturar qualquer exceção de tarefas.
Esta é uma maneira simples e clara de escrevê -lo.
A cópia do código é a seguinte:
getrssaddress ('endereço.txt')
.TENHEN (GETRSS)
. então (poupadores)
.catch (function (err) {
console.log (err);
});
A promessa traz grande conveniência à programação assíncrona, permitindo -nos focar na implementação de uma única tarefa sem cair no infortúnio da pirâmide. O código acima é apenas o uso básico. Quando o.js fornece muito mais do que as funções mencionadas neste artigo, consulte a API oficial para obter detalhes.