我怎么可以这样写一个jQuery的递延功能 [英] How can I write this as a jQuery deffered function
问题描述
我需要得到数据库中所有的表,然后我一个删除之一。然而,每个 DROP TABLE
是asnyc。 最重要返回的承诺,只应在所有的表都被丢弃解决。
I need to get ALL the tables in the database and then I delete them one by one. However each DROP TABLE
is asnyc. Most importantly the returned promise should only be resolved when all the tables have been dropped.
clear: function() {
var dfd = $.Deferred();
var sql = "SELECT name FROM sqlite_master WHERE type='table' AND name != ?",
args = ["__WebKitDatabaseInfoTable__"];
var dbTableNamesResult = function(tx, result) {
var dropSql = "";
for (var i = 0; i < result.rows.length; i++) {
dropSql = "DROP TABLE IF EXISTS " + result.rows.item(i).name + "; ";
execute(dropSql, null, errorCallback);
}
};
execute(sql, args, dbTableNamesResult, dfd.reject);
return dfd;
},
执行
有四个参数, SQL
,参数
, successCallback
和 errorCallback
。
Execute
takes four parameters, sql
, arguments
, successCallback
and errorCallback
.
推荐答案
这个怎么样:
clear: function() {
var dfd = $.Deferred();
var sql = "SELECT name FROM sqlite_master WHERE type='table' AND name != ?",
args = ["__WebKitDatabaseInfoTable__"];
dfd.pipe(function(tx, result) {
var deferreds = [];
for (var i = 0; i < result.rows.length; i++) {
var dfd = $.Deferred();
dropSql = "DROP TABLE IF EXISTS " + result.rows.item(i).name + "; ";
execute(dropSql, dfd.resolve, errorCallback);
deferreds.push(dfd);
}
return $.when.apply(null, deferreds);
});
execute(sql, args, dfd.resolve, dfd.reject);
return dfd;
},
下面是一个类似的例子 http://jsfiddle.net/zerkms/XQwPq/
Here is a similar example http://jsfiddle.net/zerkms/XQwPq/
function getTables()
{
var dfd = $.Deferred();
$.ajax({
url: '/echo/json/',
data: {
json: '{"tables":["a","b","c"]}',
delay: 1
},
type: 'post',
dataType: 'json',
success: function(response) {
dfd.resolve(response.tables);
}
});
return dfd;
}
function dropTables(tables)
{
console.log('tables to delete: ' + tables.join(', '));
var deferreds = [];
for (var i = 0, len = tables.length; i < len; i++) {
var dfd = $.Deferred();
(function(dfd) {
$.ajax({
url: '/echo/json/',
data: {
json: '{"table":"' + tables[i] + '"}',
delay: Math.random() * 3
},
type: 'post',
dataType: 'json',
success: function(response) {
console.log('table ' + response.table + ' deleted');
dfd.resolve();
}
});
})(dfd);
deferreds.push(dfd);
}
return $.when.apply(null, deferreds);
}
getTables().pipe(dropTables).done(function() {
console.log('process finished');
});
说明:第一个功能的getTables
推迟返回的对象与Ajax请求的结果。我们管另一个函数 dropTables
与它在其中创建另一个延迟对象,将接受ñdeferreds其<code>在。只要他们都解决了 - 最后的匿名与结束进程
显示
Description: first function getTables
returns deferred object with result of ajax request. We pipe another function dropTables
with it and create in it another deferred object, that will accept N deferreds to its when
. And as long as they are resolved - final anonymous with process finished
is shown
这篇关于我怎么可以这样写一个jQuery的递延功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!