当顶级等待不可用时如何从承诺中分配顶级常量

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

好的,并不是绝对有必要移动其中的所有内容,但这只是说明您可以如何解决您的问题。