声明前如何在承诺链接中使用变量?
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()]);
}
这是变量作用域的一个完美例子。在您的情况下,此代码很有可能有效。因为 readFile
比 verifyToken
花费的时间更长。因此,session
变量在 then
函数中获得回调之前启动。
如果 verifyToken
比 readFile
花费的时间更长(即使只是 milli-second),那么它会抛出 Cannot access variable before initialization
错误。
我在处理 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()]);
}
这是变量作用域的一个完美例子。在您的情况下,此代码很有可能有效。因为 readFile
比 verifyToken
花费的时间更长。因此,session
变量在 then
函数中获得回调之前启动。
如果 verifyToken
比 readFile
花费的时间更长(即使只是 milli-second),那么它会抛出 Cannot access variable before initialization
错误。