Chain of Jquery Promises
Chain of Jquery Promises
我有一个简单的事件链:
- 从元数据表中获取列(异步)
- 加载选定列(异步)
- 渲染列表
我过去只是把这些函数串起来,每个函数都在完成后调用下一个函数。然而,发生了什么并不十分明显(调用getColumnsFromMeta
会导致视图被填充)。因此,为了清晰和代码重用,我想使用JQuery
Promises
重构它们。我以前用过承诺。但是,我如何链两个以上?getColumnsFromMeta ().then(loadSourceFromDatabase /*some arguments*/) //.then(renderList)?;
以下是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();
};
它应该类似于:
function getColumnsFromMeta()
{
var d = $.Deferred();
// retrieve data in async manner and perform
// d.resolve(columns);
return d.promise();
}
function loadSelectedColumns(columns)
{
var d = $.Deferred();
// retrieve data in async manner and perform
// d.resolve(data);
return d.promise();
}
function render(data)
{
// render your data
}
getColumnsFromMeta().pipe(loadSelectedColumns).pipe(render);
http://jsfiddle.net/zerkms/xYDbm/1/-这是的工作样本
http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/——这是我非常喜欢的关于promise 的文章
/**
* takes a list of componentIDs to load, relative to componentRoot
* returns a promise to the map of (ComponentID -> componentCfg)
*/
function asyncLoadComponents (componentRoot, components) {
var componentCfgs = {};
function asyncLoadComponentCfg(component) {
var url = _.sprintf("%s/%s", componentRoot, component);
var promise = util.getJSON(url);
promise.done(function(data) {
componentCfgs[component] = data;
});
return promise;
}
var promises = _.map(components, asyncLoadComponentCfg);
var flattenedPromise = $.when.apply(null, promises);
var componentCfgPromise = flattenedPromise.pipe(function() {
// componentCfgs is loaded now
return $.Deferred().resolve(componentCfgs).promise();
});
return componentCfgPromise;
}
var locale = 'en-US';
var componentRoot = '/api/components';
var components = ['facets', 'header', 'DocumentList'];
$.when(asyncLoadComponents(componentRoot, components)).done(function(componentCfgs) {
buildDocumentListPage(locale, componentCfgs)
});
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 如何使用jQuery自动打开页面上的所有链接
- 如何使用jquery在填充自动完成的值后使文本框只读
- jQuery:循环一个具有不同超时值的循环
- 用程序搜索JQuery数据表中的文本
- jQuery Promises with chained setTimeouts
- 如何测试 jQuery 3.0 beta 在浏览器中是否兼容 Promises/A+
- 我可以将Promises传递给jQuery.when(),还是只传递Deferred
- Chain of Jquery Promises
- jQuery Deferred/Promises with many getJSON
- 将ES6 Promises与JQuery Promises混合使用
- jQuery Validation with promises
- jQuery 承诺是否符合 Promises/A+
- jQuery Promises不起作用
- jQuery ajax with ES6 Promises
- 使用Promises加载带有JavaScript的jQuery
- 在jQuery中使用.then()链接promises/Deferred
- 在我的代码中使用Promises?使用deffered对象和Jquery
- issue with jquery promises
- jQuery的异步循环deferred (promises)