什么';根据JavaScript中的异步函数暂停整个脚本执行的正确方法是什么?

什么';根据JavaScript中的异步函数暂停整个脚本执行的正确方法是什么?,javascript,Javascript,我的很多脚本取决于首先使用fetch()和.JSON()从.JSON文件读取的信息,因此它是异步的。我需要延迟脚本的其余部分的执行,直到这些函数完成,而不需要将代码的其余部分粘在一个巨大的.then()或函数块中。我已经四处搜索过了,但我真的找不到我要找的东西 let config; fetch(chrome.runtime.getURL("../config.json")) .then(response => response.json()) .then(json =>

我的很多脚本取决于首先使用
fetch()
.JSON()
从.JSON文件读取的信息,因此它是异步的。我需要延迟脚本的其余部分的执行,直到这些函数完成,而不需要将代码的其余部分粘在一个巨大的
.then()
或函数块中。我已经四处搜索过了,但我真的找不到我要找的东西

let config;

fetch(chrome.runtime.getURL("../config.json"))
  .then(response => response.json())
  .then(json => config = json);

console.log(config);
// REST OF SCRIPT

它应该记录config JSON对象或promise,但显然,它只返回未定义的。任何帮助都将不胜感激

在请求返回之前,正在读取您的
config
。您可以添加另一个
然后
子句:

let config;

fetch(chrome.runtime.getURL("../config.json"))
  .then(response => response.json())
  .then(json => config = json)
  .then(() => {
     console.log(config);
   });
您可以使用以下选项:

fetch(chrome.runtime.getURL("../config.json"))
    .then(response => response.json())
    .then(config => console.log(config));
或:


您只有一个线程可以使用,因此无法回避这样一个事实:您需要执行配置的异步获取,然后继续执行程序的其余部分。大多数javascript都是事件驱动的,所以这通常不是什么大问题。您可以使用一种风格编写代码,其中代码的主要入口是
main()
函数,然后您可以在获取它之后使用配置调用它:

fetch(chrome.runtime.getURL("../config.json"))
  .then(response => response.json())
  .then(main);

function main(config){
  // do stuff


}

任何较大的代码库都将被重构为较小的函数,因此理想情况下,您的
函数一开始就不应该太大。

添加另一个
,然后
或使用
异步
/
等待
^我认为在函数之外无法工作,但总体而言,这是一个更好的选择:)可能重复的是,没有办法绕过ypur代码周围的巨大功能块我想在脚本的其余部分访问不同位置的
config
对象,因此,如果可以的话,我真的不想把整个脚本的其余部分放在一个
then
子句中。你必须这样或那样做,因为它是“异步的”,如果你想在“then”之外“模拟”它,你可以使用
async
wait
,但请记住它只是在模拟上面的内容,这是语法糖,没办法。承诺一路走来。如果担心性能,您可以编写一个名为getConfig()的承诺返回包装,第一次缓存配置。您也必须
等待响应。json()
。没错,我已经解决了这个问题。我有点犹豫是否要将我的整个脚本包装成一个
,然后
,但是将它拆分成一个
main()
,就像在其他语言中一样,这是一个非常好的方法。谢谢另外,当您执行
时,则(函数)它只是调用该函数并将承诺值作为参数传递给该函数吗?是的
then()
接受一个函数。因此,您可以执行
然后(config=>main(config))
,但这只是在本例中增加了一个间接级别,因为
main
已经是一个函数了。
fetch(chrome.runtime.getURL("../config.json"))
  .then(response => response.json())
  .then(main);

function main(config){
  // do stuff


}