【发布时间】:2020-01-12 03:02:29
【问题描述】:
我终其一生都无法弄清楚为什么 async/await 的行为方式会如此。
考虑这个例子。
我想要一个函数来进行一些数据库初始化,并在完成后返回我的数据库对象。
var globalDb = null;
const IDB_DATABASE_NAME = "mydb";
const IDB_STORE_NAME = "mystore";
const IDB_VERSION = 1.0;
async function initDb() {
var idbOpenDbRequest = window.indexedDB.open(IDB_DATABASE_NAME, IDB_VERSION);
idbOpenDbRequest.onsuccess = function (event) {
return event.target.result;
};
}
(async () => {
globalDb = await initDb();
console.log("I should happen second")
console.log(globalDb);
})();
预期
- console.log("我应该先发生")
- console.log("我应该第二次发生")
- console.log(globalDb); //将对象转储到控制台
实际
- console.log("我应该第二次发生")
- console.log(globalDb); //未定义
- console.log("我应该先发生")
我意识到我从根本上误解了这里的一些东西。请告诉我为什么 await 不能像我预期的那样工作。 :)
JsFiddle
https://jsfiddle.net/p2jqyrou/2/
附言。忘记这是关于 indexedDb 的,并且这个示例非常简化 - 我认为这对于这个问题的主题并不重要。
【问题讨论】:
-
对于 async/await 在这里的工作方式确实有些混乱。我会尝试提供并回答,但与此同时,this 可能会有所帮助?
-
你正在等待
initDb(),但你不能等待setTimeout,因为它没有返回承诺,因此控制台登录意外(实际上是预期的)命令和函数返回未定义没有返回任何东西。 -
@TheReason 他从
setTimeout回调返回东西,并期望它是initDb()的返回。 @Kjensen 它不是那样工作的。 -
@VaibhavVishal 我现在删除了 setTimeout,它只是说明了关于时间的一点,这对我来说很愚蠢,因为它增加了复杂性(实际上在这种情况下搞砸了我的示例)。基本问题/问题仍然相同:为什么函数没有返回任何内容 - 为什么 console.log 的顺序与我的预期不同?
-
@Kjensen 为了从函数中获取一些东西,你应该先返回它。你有没有从
initDb返回任何东西?
标签: javascript asynchronous async-await ecmascript-2017