使用promise设置一个变量以从回调函数中获取返回
Posted
技术标签:
【中文标题】使用promise设置一个变量以从回调函数中获取返回【英文标题】:setting a variable to get return from call back function using promise 【发布时间】:2014-04-27 11:59:31 【问题描述】:我得到的是“对象”值而不是确切值。 如何使用回调函数获取返回的值?
function loadDB(option, callBack)
var dfd = new jQuery.Deferred(),
db = window.openDatabase('mydb', '1.0', 'Test DB', 1024*1024),
selectQuery = "SELECT log FROM LOGS WHERE id = ?";
db.transaction(function(tx)
tx.executeSql(selectQuery,[option],function(tx,results)
var retval;
if( results.rows.length )
retval = unescape(results.rows.item(0)['log']);
var returnValue = dfd.resolve(retval);
);
);
return dfd.promise();
results = loadDB(2).then(function(val) return val; );
console.log("response***",results);
【问题讨论】:
【参考方案1】:您无法获得承诺(这里:异步)上下文的解析值out。
相反,您需要将console.log
调用以及依赖它的所有其他内容移入承诺上下文:
loadDB(2).then(function(val)
console.log("response***", val);
);
【讨论】:
@dystroy 是“异步并发在 javascript 中是如何工作的”——这些问题很常见,并且会一直很常见。这是一个公平的问题,Bergi 的回答很好:) @BenjaminGruenbaum 当然这是一个很好的答案。我只是想知道我们是否应该链接到大型规范 QA。【参考方案2】:承诺就像一个封闭的盒子:
您上面的带有延迟对象的代码创建了盒子,并让您知道在将来的某个时间您可以打开它。那个时候上面的代码将调用.resolve
。
当您执行results = loadDB(2)
时,您会将一个框 放入结果中。
promise 也有一个方法可以打开盒子,作用于值并返回另一个盒子(同时打开任何额外的盒子)。那个方法是.then
:
在盒子里,它确实:
=>( . => ) =>
也就是说,它获取盒子,打开它并应用一个函数来处理其中的值,然后返回另一个带有新值的盒子。
所以,如果你想处理值,你需要钩在盒子打开的地方,就像Bergi建议的那样:
loadDB(2).then(function(val)
console.log("response***", val);
); // this also returns a promise btw
【讨论】:
其实被应用的函数不需要自己打开盒子,它单独呈现值。 上面的符号是这么说的吗?从这个意义上说,它就像一个单子——它接受一个盒子(this)和一个函数,该函数接受一个打开的盒子并返回一个封闭的盒子——并在第二个值上返回一个封闭的盒子——更正式地(不考虑递归同化)(M t )→(t→Mu)→(Mu)@Bergi 是的,但是图片下方的句子没有:-) 另外,我宁愿将其设为“盒子的内容”而不是“打开的盒子”,这听起来像M t -> (OpenM t -> M u) -> M u
啊,那么图像是模棱两可的 - 打开的框应该代表值本身是可访问的。 :)以上是关于使用promise设置一个变量以从回调函数中获取返回的主要内容,如果未能解决你的问题,请参考以下文章