gpt4 book ai didi

javascript - 等待 Promise Value 的行为

转载 作者:行者123 更新时间:2023-11-30 14:03:36 25 4
gpt4 key购买 nike

我正在开发一个基于 nodejs 和电子的应用程序,它必须从 nedb 中检索数据-数据库。我还没有完全理解 Promises 的概念,或者我认为我对它的理解已经足够使用它了,但由于 promises 的异步特性,它总是以一打嵌套回调的困惑而告终。

我知道像 this one 这样的话题以及那里提出的解决方案。如果该代码路径是“死胡同”(例如错误处理),使用回调或 .then().Promises 方法可能没问题,但对于许多顺序行,它将以无休止的嵌套代码结束。

我也知道一个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) 在将其记录到函数中时包含字符串('before return: ...')并在通过 return 返回时包含 promise的功能

  2. 为什么返回的对象在函数内部的对象之前记录到控制台?

最佳答案

Why is the same object (dbElement) containing the string when logging it inside the function ('before returning: ...') and containing the promise when handed back through the return of the function

每个 async 函数都会为其返回值返回一个 Promise。因此,当您从异步函数返回常规值时 - 您会得到该值的 promise 。

将您的“主”代码包装在 IIFE(立即调用的函数表达式)中并在那里使用 await 是完全没问题的(直到我们拥有稳定的顶层等待):

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

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

Why is the returned object logged to console before the one inside the function is?

Promise 是值(value) + 时间,JavaScript 执行模型是同步代码总是从头到尾运行,您只能在稍后“注册”平台运行的东西。所以在这种情况下,getSynchronous 同步返回,但等待发生在所有同步代码完成之后。

虽然此代码中没有任何异步内容 - 无论何时您 await 其他同步代码都有机会首先运行,因此如果您更改您正在等待的实现是真正的异步或其他东西异步你不会在你的执行顺序中遇到讨厌的竞争条件。 Promise then 回调的执行方式也是如此。

关于javascript - 等待 Promise Value 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55873743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com