考虑这段代码(缩短)
function getSecret() {
db.transaction(
function (transaction) {
transaction.executeSql(
'SELECT * FROM table LIMIT 1;',
null,
function(transaction, result) {
var row = result.rows.item(0);
var secret = row.secret;
return secret;
}, errorHandler
);
}
)
}
如何将secret的值返回给main函数?我已经阅读了这个答案Return value from nested function in Javascript
试过这个
function getSecret() {
db.transaction(
function doSql(transaction) {
transaction.executeSql(
'SELECT * FROM table LIMIT 1;',
null,
function(transaction, result) {
var row = result.rows.item(0);
var secret = row.secret;
return secret;
}, errorHandler
);
}
)
return doSql;
}
然而这不起作用。
谢谢!
答案 0 :(得分:3)
尝试:
function getSecret() {
var secret = '';
db.transaction(
function (transaction) {
transaction.executeSql(
'SELECT * FROM table LIMIT 1;',
null,
function(transaction, result) {
var row = result.rows.item(0);
secret = row.secret;
}, errorHandler
);
}
)
return secret;
}
答案 1 :(得分:1)
function getSecret() {
var retval = undefined; // or a reasonable default
db.transaction(
function doSql(transaction) {
transaction.executeSql(
'SELECT * FROM table LIMIT 1;',
null,
function(transaction, result) {
var row = result.rows.item(0);
var secret = row.secret;
retval = secret;
}, errorHandler
);
}
)
return retval;
}
这将在retval
变量上创建一个闭包。调用transaction
后,retval
将会更新。
答案 2 :(得分:0)
尝试在返回有效负载之前宣传数据库操作。
此外,您可以使用promise内置的reject()作为错误处理程序,只要函数返回undefined就返回事务对象。
在函数中声明promise:
function getSecret() {
var secret = '';
return new Promise(function(resolve, reject) {
db.transaction(
function(transaction) {
transaction.executeSql(
'SELECT * FROM table LIMIT 1;',
null,
function(transaction, result) {
if (typeof(result) === 'undefined') {
var row = result.rows.item(0);
secret = row.secret;
resolve(secret)
},
else {
reject(transaction)
}
}
);
}
)
})
}
然后调用该函数。
//If function resolves, log the secret.
//if function rejects, log the transaction
getSecret().then(function(secret) {
console.log(secret);
})
.catch(function(err) {
console.log('Error in db.transaction ' + err)
})
希望有所帮助。