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

Ana*_*han 7 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);
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 28

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

在此输入图像描述

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

当你这样做时,results = loadDB(2)你会在结果中放一个方框.

promise还有一个方法可以打开框,处理值并返回值上的另一个框(同时打开任何其他框).那种方法是.then:

在框中,它确实:

在此输入图像描述 =>( 打开.=>Ë)=> Ë

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

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

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


Ber*_*rgi 7

你不能得到的决心值一个承诺(在这里:异步)的范围内.

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

loadDB(2).then(function(val){
    console.log("response***", val);
});
Run Code Online (Sandbox Code Playgroud)