从 Javascript 中的嵌套函数返回值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3373934/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Returning values from nested functions in Javascript
提问by Pete
Consider this code (shortened)
考虑这个代码(缩短)
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
);
}
)
}
How would I return the value of secret to the main function? I have read this answer Return value from nested function in Javascript
我如何将 secret 的值返回给主函数?我已经阅读了这个答案从 Javascript 中的嵌套函数返回值
And tried this
并尝试了这个
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;
}
However this did not work.
然而这并没有奏效。
Thanks!
谢谢!
采纳答案by Sarfraz
Try:
尝试:
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;
}
回答by Fletcher Moore
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;
}
This will create a closure over the retvalvariable. When transactionis called, retvalwill be updated.
这将在retval变量上创建一个闭包。当transaction被调用时,retval将被更新。
回答by Daniel Le'Sage
Try promisifying the database operation before returning your payload.
在返回有效负载之前尝试承诺数据库操作。
Additionally, you can use promise's built in reject() as an error handler, returning the transaction object whenever the function returns undefined.
此外,您可以使用 promise 内置的 reject() 作为错误处理程序,只要函数返回 undefined 就返回事务对象。
Declare promise within function:
在函数中声明 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)
}
}
);
}
)
})
}
Then call the function.
然后调用函数。
//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)
})
Hope that helps.
希望有帮助。

