que tienen una simple cadena de acontecimientos:Cadena de Jquery Promises
- Obtener columnas de una tabla de metadatos (asíncrono)
- columnas de carga seleccionado (asíncrono)
- lista render
Solía simplemente encadenar estas funciones, cada una llamando a la siguiente cuando se había completado. Sin embargo, no es muy obvio lo que está sucediendo (llamando al getColumnsFromMeta
los resultados en la vista que se llena). Por lo tanto, en aras de la claridad y la reutilización del código, me gustaría refactorizarlos usando JQuery
Promises
. He usado promesas antes. ¿Pero cómo encadenar más de dos? getColumnsFromMeta().then(loadSourceFromDatabase /*some arguments*/) //.then(renderList)?;
Aquí hay un ejemplo de la getColumnsFromMeta
:
var getColumnsFromMeta = function(id)
{
var sql,
dfd;
dfd = $.Deferred();
var onSuccess = function(tx, result)
{
var columns = [];
for (var i = 0; i < result.rows.length; i++)
{
columns.push(result.rows.item(i).Column);
}
dfd.resolve(columns);
};
var onError = function(tx, error)
{
dfd.reject(error);
};
sql = "SELECT Column FROM Meta WHERE id = ?";
database.query(sql, [id], onSuccess, onError);
return dfd.promise();
};
Gracias por la respuesta rápida que funciona de maravilla! Y gracias por el artículo, se ve bien. Como pregunta adicional: ¿es posible encadenar .done/.always, etc. a la tubería en diferentes etapas? – JonWells
@CrimsonChin: sip. PD: dame un segundo, jsfiddle se hará en un momento – zerkms
@CrimsonChin: sí, puedes usar cualquiera de ellos, siempre y cuando 'pipe()' también devuelva diferido. PD: He añadido jsfiddle ejemplo – zerkms