等待承诺价值的行为

时间:2019-04-26 19:17:17

标签: javascript asynchronous promise

我正在开发一个基于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
  1. 为什么同一对象(dbElement)在将字符串记录到函数内部时会包含该字符串(返回之前:...),而在通过函数的return交回时包含promise

  2. 为什么返回的对象在功能内的对象之前先登录到控制台

1 个答案:

答案 0 :(得分:2)

  

为什么同一对象(dbElement)在函数中记录字符串时会包含该字符串('返回之前:...'),而在返回函数时将其包含在承诺中

每个async函数都返回一个Promise作为其返回值。因此,当您从异步函数返回常规值时,您将获得该值的承诺。

将您的“主要”代码包装在IIFE(立即调用的函数表达式)中并在其中使用await很好(直到我们拥有顶级的await稳定)。

(async () => { // can use await here

  console.log("returned: " + await getSynchronous());
})();
  

为什么返回的对象在函数内部的那个对象之前先登录到控制台?

一个承诺就是价值+时间,JavaScript执行模型是同步代码始终从头到尾运行,并且您只能“注册”要在平台上稍后运行的内容。因此,在这种情况下,getSynchronous同步返回,但是等待完成所有同步代码之后。

尽管此代码中没有异步-每当您await某个其他同步代码有机会首先运行时,这样一来,如果您更改了正在等待真正异步或异步的内容的实现,则可能会获胜在您的执行顺序中没有令人讨厌的竞争条件。对于Promise then回调通常执行的方式也是如此。