当顶级等待不可用时如何从承诺中分配顶级常量
how to assign a top-level const from a promise when top-level await is not available
我正在尝试在顶层分配一个 const
,其中值需要来自异步函数。但是我使用的生产服务器上的nodejs版本不够新,不能支持await,所以我不能这样做:
const value = await f(x)
我无法在 then
之类的内容中声明变量,因为它不在顶层范围内,所以这样的 行不通 :
f(x).then(val=>{const value=val}) // no top-level const value afterwards
如何在此环境中正确初始化 const
?
如果有帮助,对于这种特殊情况,该函数实际上对我传递给它的特定值同步 return,但由于它被定义为异步,有时 return 是异步的,它实际上是 return一直在承诺。
作为一个(可怕的)解决方法,我考虑简单地将 const
分配给 Promise,然后在需要时使用 .then()
提取值。然而,尽管 Promise 得到了解决,但这似乎总是导致值被异步提取,这意味着它不会像我需要我需要的值那样工作,而不是在当前函数完成之后或任何时候。
你需要用“let”而不是const来定义你的var,然后在“then”中赋值。
let value;
f(x).then(val => value = val)
也许你有更好的方法来做到这一点,但在我们的背景下,我会这样做。
您必须将所有需要该 const 值的代码移动到一个函数中。在(大)then
回调中移动它,或者创建一个 async
函数包装器。
假设您的代码现在如下所示:
async function f(x) {
// ....
return //...
}
function g(value) {
// something
}
const value = await f(x);
// ...
g(value);
// ...
console.log(value);
// ...
然后将其更改为:
(async function main() {
async function f(x) {
// ....
return // ...
}
function g(value) {
// something
}
const value = await f(x);
// ...
g(value);
// ...
console.log(value);
// ...
})(); // Execute main
好的,并不是绝对有必要移动其中的所有内容,但这只是说明您可以如何解决您的问题。
我正在尝试在顶层分配一个 const
,其中值需要来自异步函数。但是我使用的生产服务器上的nodejs版本不够新,不能支持await,所以我不能这样做:
const value = await f(x)
我无法在 then
之类的内容中声明变量,因为它不在顶层范围内,所以这样的 行不通 :
f(x).then(val=>{const value=val}) // no top-level const value afterwards
如何在此环境中正确初始化 const
?
如果有帮助,对于这种特殊情况,该函数实际上对我传递给它的特定值同步 return,但由于它被定义为异步,有时 return 是异步的,它实际上是 return一直在承诺。
作为一个(可怕的)解决方法,我考虑简单地将 const
分配给 Promise,然后在需要时使用 .then()
提取值。然而,尽管 Promise 得到了解决,但这似乎总是导致值被异步提取,这意味着它不会像我需要我需要的值那样工作,而不是在当前函数完成之后或任何时候。
你需要用“let”而不是const来定义你的var,然后在“then”中赋值。
let value;
f(x).then(val => value = val)
也许你有更好的方法来做到这一点,但在我们的背景下,我会这样做。
您必须将所有需要该 const 值的代码移动到一个函数中。在(大)then
回调中移动它,或者创建一个 async
函数包装器。
假设您的代码现在如下所示:
async function f(x) {
// ....
return //...
}
function g(value) {
// something
}
const value = await f(x);
// ...
g(value);
// ...
console.log(value);
// ...
然后将其更改为:
(async function main() {
async function f(x) {
// ....
return // ...
}
function g(value) {
// something
}
const value = await f(x);
// ...
g(value);
// ...
console.log(value);
// ...
})(); // Execute main
好的,并不是绝对有必要移动其中的所有内容,但这只是说明您可以如何解决您的问题。