JavaScript - 标准脚本中的顶级等待

JavaScript - Top Level Await In Standard Script

提问人:Ood 提问时间:10/4/2023 最后编辑:Ood 更新时间:10/4/2023 访问量:101

问:

正如这里的答案所指出的,可以在模块的顶层使用,这是现在所有主要浏览器都支持的功能。await

但是,对于常规脚本(不是模块),异步操作之后的所有代码都需要包装在一个函数中。下面是使用 promise 演示这一点的简单示例:

function renderLayout(){

    // Simplified for demonstration

    return new Promise((resolve) => {

        setTimeout(() => {

            resolve();

        }, 1000);

    });

}

renderLayout().then(() => {

    // All code after the promise gets executed in this function

    console.log('Done!');

});

我在使用这种方法时面临的问题是,在异步操作之后从函数中执行代码可能是不可取的,例如,因为它为该代码块引入了新的范围或允许使用语句。return

我目前正在开发一个脚本,该脚本对布局执行一些异步更改,并希望脚本的其余部分仅在进行这些更改才继续,就好像它们是直接在全局范围内执行的,而不是从函数执行的。

我还应该提到,这是模板/预处理系统的一部分,其中异步操作之后的部分是动态生成的,这就是为什么我更喜欢它的“标准”行为。

鉴于这在模块中是可能的,我希望有一种方法可以在常规脚本中实现它。如果有人知道实现这一目标的方法,将不胜感激。

JavaScript 异步 async-await promise

评论

0赞 Bergi 10/4/2023
"允许使用 return 语句“ - 呃,为什么要在脚本的顶层使用语句return
0赞 Bergi 10/4/2023
不可以,这是不可能的 - 默认情况下,脚本执行会阻止渲染,因此不得使用 .为什么不使用真正的模块呢?或者让你的模板系统在函数中发出代码?为什么代码需要在全局范围内运行,它有什么作用?你对布局有什么改变,为什么它需要异步?await
0赞 Ood 10/4/2023
@Bergi 确切地说,它应该抛出一个错误,如果动态代码在函数中呈现,则不会抛出错误。代码的动态部分应该像在顶层运行的常规脚本一样,插入到我的“模板”中,即系统采用类似于示例中的代码,将其与必要的动态部分组合在一起,并将其作为单个文件提供。
0赞 Bergi 10/4/2023
"代码的动态部分应该像在顶层运行的常规脚本一样“——但事实并非如此。常规脚本会立即运行并阻止渲染。如果它只在异步布局动画之后运行,则这是不可能的。但是,是什么让您认为动态部分实际上需要像全局脚本一样运行?当然,它不包含语句,并期望它抛出语法错误。return
1赞 Bergi 10/4/2023
好吧,如果你坚持,你可以在布局完成后在全局范围内动态地使用它(或创建一个内联元素);你的模板只需要将用户提供的部分字符串化(或将其放入元数据脚本或不会立即计算的内容中)。但我仍然强烈建议不要在全局范围内运行用户提供的代码,而只是正确地记录这种行为。eval<script>

答:

-1赞 Alexander Nenashev 10/4/2023 #1

只需用异步 IIFE 包装整个脚本,这样您就可以“有点”在模块中模拟顶层。您也可以考虑添加,因为模块是延迟的。awaitdeferscript