Supongamos un escenario comercial:
A través de la dirección RSS, obtenga el RSS y guárdelo en el archivo, y la dirección RSS se guarda en el archivo.
Para completar el negocio en este escenario, se requieren tres tareas:
1. Lea la dirección RSS del archivo.
2. Obtenga RSS.
3. Guarde en el archivo.
Finalmente, estas tres tareas están integradas.
Preparar:
Archivos que almacenan la dirección RSS, dirección.txt.
http://programmer.csdn.net/rss_programmer.html
Tarea 1:
Lea el contenido del archivo de dirección RSS y regrese a través de la devolución de llamada.
La copia del código es la siguiente:
var getrssaddress = function (ruta, devolución de llamada) {
fs.ReadFile (ruta, {codificación: 'utf8'}, function (err, data) {
devolución de llamada (err, datos);
});
}
Tarea 2:
Llegue a RSS a través de la dirección RSS y devuelva el error o los datos a través de la devolución de llamada.
La copia del código es la siguiente:
var getrss = function (url, devolución de llamada) {
var data = '';
http.get (url, function (res) {
res.on ('Data', function (Chrunk) {
datos += chrunk;
});
res.on ('end', function () {
devolución de llamada (nulo, datos);
});
}). on ('error', function (err) {
devolución de llamada (err, nulo);
});
}
Tarea 3:
Guarde RSS en un archivo y devuelva un error a través de la devolución de llamada.
La copia del código es la siguiente:
var saverss = function (datos, devolución de llamada) {
fs.WriteFile ('rss.txt', data, 'utf8', function (err) {
devolución de llamada (err);
});
}
Integración:
La copia del código es la siguiente:
getRSSADDRESS ('Dirección.txt', function (err, data) {
if (err) {
console.log (err);
devolver;
}
getRSS (datos, function (err, data) {
if (err) {
console.log (err);
devolver;
}
Saverss (Data, Function (ERR) {
if (err) console.log (err);
});
});
});
El código anterior es el procesamiento completamente asincrónico. La devolución de llamada más común se usa para manejar la devolución de la lógica asíncrona. La ventaja es que el método de escritura estándar es fácil de aceptar para todos; La desventaja es que el acoplamiento es demasiado fuerte, el manejo de excepciones es que el código no es intuitivo, especialmente cuando se trata de lógica comercial compleja y muchas tareas, las devoluciones de llamada en capas harán que las personas las mire y el código sea difícil de mantener.
Una de las implementaciones de la especificación Promise/A es cuando.js, que está dirigida a tal dominio de problemas.
Echemos un vistazo al código modificado.
Tarea 1:
La copia del código es la siguiente:
var getrssaddress = function (ruta) {
var diferido = when.defer ();
fs.ReadFile (ruta, {codificación: 'utf8'}, function (err, data) {
if (err) diferido.reject (err);
diferido.resolve (datos);
});
regresar diferido.promise;
}
Tarea 2:
La copia del código es la siguiente:
var getrss = function (url) {
var diferido = when.defer ();
var data = '';
http.get (url, function (res) {
res.on ('Data', function (Chrunk) {
datos += chrunk;
});
res.on ('end', function () {
diferido.resolve (datos);
});
}). on ('error', function (err) {
diferido.reject (err);
});
regresar diferido.promise;
}
Tarea 3:
La copia del código es la siguiente:
var saverss = function (data) {
var diferido = when.defer ();
fs.WriteFile ('rss.txt', data, 'utf8', function (err) {
if (err) diferido.reject (err);
diferido.resolve ();
});
regresar diferido.promise;
}
Integración:
La copia del código es la siguiente:
getRSSADDRESS ('Dirección.txt')
. Entonces (getrss)
. Entonces (ahorradores)
.catch (function (err) {
console.log (err);
});
explicar:
El modelo "diferido/promesa" definido por la especificación Promise/A es el modelo "publicar/suscriptor". Publicar eventos a través del objeto diferido puede ser un evento de resolución de finalización o un evento de rechazo fallido; Las suscripciones completadas o fallidas correspondientes se realizan a través del objeto Promise.
En las promesas/una especificación, cada tarea tiene tres estados: predeterminado (pendiente), cumplido (cumplido) y fallido (rechazado).
1. El estado predeterminado se puede transferir al estado de finalización en una dirección. Este proceso se llama resolución, y el método correspondiente se difiere.
2. El estado predeterminado también se puede transferir al estado fallido en una dirección. Este proceso se denomina rechazo, y el método correspondiente es diferido.reject (razón);
3. En el estado predeterminado, también puede declarar la información de ejecución de la tarea a través de Dferred.notify (actualización), como el progreso de la ejecución;
4. La transferencia de estado es una vez. Una vez que la tarea cambia de la pendiente inicial a otros estados, ingresará el proceso de ejecución de la siguiente tarea.
Siga el código anterior.
Defina un objeto diferido a través de cuándo.
var diferido = when.defer ();
Después de que los datos asíncronos se obtienen con éxito, se publica un evento de finalización.
diferido.resolve (datos);
Después de que falla la adquisición de datos asíncronos, se publica un evento fallido.
diferido.reject (err);
Y devuelva el objeto Promise como suscripción.
regresar diferido.promise;
La suscripción es una suscripción completa/fallida/notificada a través del método entonces del objeto Promise.
getRSSADDRESS ('Dirección.txt')
. Entonces (getrss)
Luego hay tres parámetros, a saber, Onfulled, Onrejected y OnProgress
Promesa. Entonces (Onfulled, OnRejed, OnProgress)
La tarea anterior es resolución (datos), y la función onfullida se activará, y los datos se utilizarán como su parámetro.
Si se rechaza la tarea anterior (razón), entonces se activará OnRejed y se recibirá una razón.
En cualquier momento, solo uno de Onfullimed y OnRejeded puede activarse y solo una vez.
Para manejar excepciones, cuando.js también proporciona un método extremadamente conveniente. Luego puede pasar errores. Cuando múltiples tareas se ejecutan en serie, solo podemos definir en el inicio en el último. También puede llamar a la función de captura después de la última y luego ver cualquier excepción de tarea.
Esta es una forma simple y clara de escribirlo.
La copia del código es la siguiente:
getRSSADDRESS ('Dirección.txt')
. Entonces (getrss)
. Entonces (ahorradores)
.catch (function (err) {
console.log (err);
});
Promise trae una gran comodidad a la programación asincrónica, lo que nos permite centrarnos en la implementación de una sola tarea sin caer en la desgracia piramidal. El código anterior es solo un uso básico. When.js proporciona mucho más que las funciones mencionadas en este artículo, consulte la API oficial para obtener más detalles.