声明前如何在承诺链接中使用变量?

How can variable be used in promise chaining before declaration?

我在处理 promises 时遇到了以下代码。它工作正常。

我浅浅地阅读了 async/await 代码如何在节点上 运行。但是,在下面的代码中,如何在 .then() 函数中访问 session 变量?这段代码的工作仅仅是偶然的,还是关于节点 运行 的 async/await 代码如何使 session 变量在 .then() 函数中可用?

async function asyncFunction(
  cb: (filePath: string, session: Session) => Promise<any>,
) {
    readFile().then(filePath => cb(filePath, session));
    const session = await verifyToken();
}

Is it just by sheer chance that this code works?

是的。如果 verifyToken 花费的时间比 readFile 长,session 将在 .then() 回调运行时 ,您将得到一个异常。

此问题的正确解决方案是 Promise.all,而不是使用回调:

async function asyncFunction(): Promise<[filePath: string, session: Session]> {
    return Promise.all([readFile(), verifyToken()]);
}

这是变量作用域的一个完美例子。在您的情况下,此代码很有可能有效。因为 readFileverifyToken 花费的时间更长。因此,session 变量在 then 函数中获得回调之前启动。

如果 verifyTokenreadFile 花费的时间更长(即使只是 milli-second),那么它会抛出 Cannot access variable before initialization 错误。