http://docs.phonegap.com/en/3.1.0/cordova_storage_storage.md.html#SQLTransaction上的PhoneGap Web SQL数据库文档列出了以下JavaScript代码片段:
function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS DEMO');
tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}
我保证上面代码片段中的四个SQL语句将按顺序执行(即,DROP TABLE命令肯定会先执行,然后是CREATE TABLE语句,然后执行,等等)?有很多关于PhoneGap Web SQL数据库API的异步性质的帖子,但我找不到有关PhoneGap Web SQL数据库API的顺序性质的任何帖子。正如您可能想象的那样,如果DROP TABLE语句没有首先完成执行,则执行CREATE TABLE语句没有任何意义。
答案 0 :(得分:0)
是。这些行按顺序执行,除非你有一些条件分支...比如if-else-then。
对于上面的代码片段,它将按顺序执行..保证。
答案 1 :(得分:0)
不幸的是,它无法保证。 Websql规范并没有说请求必须按顺序执行,而IndexedDB API则执行。但大多数实现方面都要求排序,但很少有人不这样做。
正确的方法是监听请求成功回调并使用回调中的tx来保证顺序执行。
答案 2 :(得分:0)
我遇到了同样的问题。我写了一个函数,以便更容易避免回调地狱。我相信可能有类似的东西,但这里是我的。我用100,000行测试了它,没问题
function runSqlSeries(tx, sqls, parameterss, fnum, callback) {
if (typeof sqls === 'string') {
sqls = [sqls];
}
var totalNumber = sqls.length;
var sqlIndex = fnum;
if (parameterss && sqls.length == 1 && parameterss.length > 1) {
//ie one sql statement run many times
totalNumber = parameterss.length;
sqlIndex = 0;
}
if (fnum >= totalNumber) {
callback(true, "success - ran " + fnum + " sql statements");
return;
}
var successFn = function() {
astracore.runSqlSeries(tx, sqls, parameterss, fnum + 1, callback);
}
var errorFn = function(tx, error) {
callback(false, "Error running function " + fnum + " " + error.message);
}
var parameters = [];
if (parameterss) {
parameters = parameterss[fnum];
}
tx.executeSql(sqls[sqlIndex], parameters, successFn, errorFn);
};