使用promise设置变量以从回调函数返回

时间:2014-03-20 14:41:22

标签: javascript callback promise

我正在获得"对象"值而不是确切的值。 如何使用回调函数获取返回的值?

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);

2 个答案:

答案 0 :(得分:21)

承诺就像一个封闭的盒子:

enter image description here

您的上述代码与延迟对象一起创建了该框,并让您知道将来某个时候您可以打开它。那段时间是以上代码调用.resolve的时间。

当您执行results = loadDB(2)时,您将一个放在结果中。

承诺还有一个打开框的方法,对值进行处理并返回值上的另一个框(同时打开任何其他框)。该方法为.then

在框中,它确实:

enter image description here =>(open。=> e)=> e

也就是说,它取出框,打开它并应用一个函数来对其中的值执行某些操作,然后返回另一个带有新值的框。

所以,如果你想处理这个值,你需要挂在盒子打开的地方,就像Bergi建议的那样:

loadDB(2).then(function(val){
    console.log("response***", val);
}); // this also returns a promise btw

答案 1 :(得分:7)

您无法获得承诺(此处为:异步)上下文的解析值 out

相反,您需要将console.log调用以及依赖于它的所有其他内容移动到承诺上下文中:

loadDB(2).then(function(val){
    console.log("response***", val);
});