我有以下功能:
function query(db, querystr){
var resultSet;
db.transaction(function(tx){
tx.executeSql(querystr, [], function(tx, results){
console.log("ROWS ---> "+results.rows);
resultSet = results.rows;
}, dbError);
}, dbError, dbSuccess);
return resultSet;
}
如何在main函数中获得results.rows以便我可以返回调用者?
假设调用者执行以下操作:
var result_rows = query(db, 'select 1 from dual');
如何确保result_rows从tx.executeSql嵌套函数中获取results.rows值?我在这个例子中的方式是调用者未定义。
谢谢你, TS
答案 0 :(得分:0)
尝试这样的事情。将回调函数传递给query()函数,并在执行executeSql函数后调用它。
function query("ss","querystr" function (data){
//data contains results.rows from query function
});
function query(db, querystr, cb){
db.transaction(function(tx){
tx.executeSql(querystr, [], function(tx, results){
cb(results.rows);
//console.log("ROWS ---> "+results.rows);
resultSet = results.rows;
}, dbError);
}, dbError, dbSuccess);
}
答案 1 :(得分:0)
对于初学者来说,Barmar的评论是正确的:你永远不能保证数据能够在同一个Javascript线程/堆栈/任何你称之为的内容中返回,所以你不能只返回它。
对异步检索项执行某些操作的最常见模式是请求函数应传入一个onSuccess函数,并将结果数据作为参数进行调用。这种模式对性能要好得多,因为UI线程没有被阻止。
var pizza = getMeAPizza('pepperoni');
console.log('Yesss, got my pizza.');
//becomes...
getMeAPizza('pepperoni', function(pizza) {
console.log('Yesss, got my pizza.');
}
我认为如果你正在开发一个JQuery插件,正如你所说的那样,根据我的理解,一个常见的模式是在返回它时实现“Deferred”对象定义,因此调用函数可以链接一个行动。这部分是我的二手知识,所以我不会费心去拼命解释它......