我正在开发一个基于nodejs和electronic的应用程序,该应用程序必须从nedb数据库中检索数据。我还没有完全理解Promises的概念,或者我已经足够理解它,可以使用它了,但是由于Promise的异步特性,它总是以一堆嵌套的回调结束。
我知道像this one这样的线程以及在那里提出的解决方案。如果该代码路径是“死胡同”(例如,错误处理),则使用回调或Promises的.then()。方法可能很好,但是对于许多顺序行,它最终将以无穷嵌套的代码结尾。
我也知道一个should not use return await ...()
,但是我尝试了一些使异步方法同步的方法。以下代码提出了一些问题:
function getFromDatabase() {
return new Promise((resolve, reject) => {
//do something with asynchronous database api
resolve('database element');
})
}
async function getSynchronous() {
var dbElement = await getFromDatabase();
console.log("before returning: " + dbElement)
return dbElement;
}
console.log("returned: " + getSynchronous());
代码将返回:
returned: [object Promise]
before returning: database element
为什么同一对象(dbElement)在将字符串记录到函数内部时会包含该字符串(返回之前:...),而在通过函数的return
交回时包含promise
为什么返回的对象在功能内的对象之前先登录到控制台 ?
答案 0 :(得分:2)
为什么同一对象(dbElement)在函数中记录字符串时会包含该字符串('返回之前:...'),而在返回函数时将其包含在承诺中
每个async
函数都返回一个Promise
作为其返回值。因此,当您从异步函数返回常规值时,您将获得该值的承诺。
将您的“主要”代码包装在IIFE(立即调用的函数表达式)中并在其中使用await很好(直到我们拥有顶级的await稳定)。
(async () => { // can use await here
console.log("returned: " + await getSynchronous());
})();
为什么返回的对象在函数内部的那个对象之前先登录到控制台?
一个承诺就是价值+时间,JavaScript执行模型是同步代码始终从头到尾运行,并且您只能“注册”要在平台上稍后运行的内容。因此,在这种情况下,getSynchronous
同步返回,但是等待完成所有同步代码之后。
尽管此代码中没有异步-每当您await
某个其他同步代码有机会首先运行时,这样一来,如果您更改了正在等待真正异步或异步的内容的实现,则可能会获胜在您的执行顺序中没有令人讨厌的竞争条件。对于Promise
then
回调通常执行的方式也是如此。