使用promise设置一个变量以从回调函数中获取返回值

IT技术 javascript callback promise
2021-02-09 07:09:18

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

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个回答

Promise就像一个封闭的盒子:

在此处输入图片说明

上面带有延迟对象的代码创建了框,并让您知道将来某个时间您可以打开它。那个时候就是上面的代码将调用.resolve.

当您这样做时,results = loadDB(2)您将在结果中放入一个框

一个promise还有一个方法可以打开盒子,处理值并返回另一个盒子的值(同时打开任何额外的盒子)。该方法是.then

在盒子中,它可以:

在此处输入图片说明=>( 打开. => 电子) =>电子

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

所以,如果你想处理这个值,你需要钩住那个盒子打开的地方,就像贝尔吉建议的那样:

loadDB(2).then(function(val){
    console.log("response***", val);
}); // this also returns a promise btw
啊,那么图像是模棱两可的 - 打开的框应该代表可以访问的值本身。:)
2021-03-16 07:09:18
是的,但图片下方的句子没有 :-) 另外,我宁愿将其设为“盒子的内容”而不是“打开的盒子”,这听起来像 M t -> (OpenM t -> M u) -> M u
2021-03-28 07:09:18
实际上,被应用的函数不需要自己打开盒子,它会单独呈现值。
2021-04-11 07:09:18
这就是上面的符号所说的?从这个意义上说,它就像一个 monad——它接受一个盒子(this)和一个接受一个开放盒子并返回一个封闭盒子的函数——并在第二个值上返回一个封闭盒子——更正式地(不考虑递归同化)(M t )→(t→M u)→(M u) @Bergi
2021-04-12 07:09:18

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

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

loadDB(2).then(function(val){
    console.log("response***", val);
});
@BenjaminGruenbaum 当然这是一个很好的答案。我只是想知道我们是否应该链接到大型规范 QA。
2021-03-22 07:09:18
@dystroy 它是“JavaScript 中的异步并发是如何工作的”——这些问题很常见,而且会一直很常见。这是一个公平的问题,Bergi 的回答很好:)
2021-04-06 07:09:18