使用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设置一个变量以从回调函数中获取返回的主要内容,如果未能解决你的问题,请参考以下文章

js-promise以及asyncawait

Promise全解析

JS中promise对象的作用与使用

为什么使用promise

如何使用 fetch 从 Promise 回调中返回返回值? [复制]

Promise/A+规范