从Javascript中的嵌套函数返回值[重复]
Posted
技术标签:
【中文标题】从Javascript中的嵌套函数返回值[重复]【英文标题】:Returning values from nested functions in Javascript [duplicate] 【发布时间】:2011-03-23 09:11:11 【问题描述】:考虑这段代码(缩短)
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;
但是这不起作用。
谢谢!
【问题讨论】:
【参考方案1】:在返回有效负载之前尝试承诺数据库操作。
此外,您可以使用 promise 内置的 reject() 作为错误处理程序,每当函数返回 undefined 时返回事务对象。
在函数中声明承诺:
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)
)
希望对您有所帮助。
【讨论】:
【参考方案2】: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
会被更新。
【讨论】:
这行不通。查询的回调函数是异步执行的,而getSecret()
的返回将在事务开始后立即发生。【参考方案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;
【讨论】:
数据库操作不是异步的吗?我很确定确实如此,因此这里的解决方案不可能奏效。查询完成时调用“成功”回调函数,而外部函数会在查询开始后立即返回。 这个“异步”问题得到解答了吗? 我也有这个问题。如果是,你解决了这个问题,那么请分享谢谢。 - 尖尖和皮特肖以上是关于从Javascript中的嵌套函数返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]