Node.js 为全局常量变量赋值时使用Async/await

Node.js 为全局常量变量赋值时使用Async/await,node.js,async-await,puppeteer,Node.js,Async Await,Puppeteer,我试图为模块声明并初始化一个具有全局作用域的const变量,它需要从异步/等待的结果中获取值。这是我尝试过的代码,变量仍然保持未定义状态。我如何重新写入它,以便我仍然可以使用一个常量,并且它保持所需的值: const puppet = require('puppeteer') const browser = (async () => { await puppet.launch() })(); const page = (async () => { await browser.newP

我试图为模块声明并初始化一个具有全局作用域的const变量,它需要从异步/等待的结果中获取值。这是我尝试过的代码,变量仍然保持未定义状态。我如何重新写入它,以便我仍然可以使用一个常量,并且它保持所需的值:

const puppet = require('puppeteer')
const browser = (async () => { await puppet.launch() })();
const page = (async () => { await browser.newPage() })();

console.log( "browser holds: " + util.inspect(page) );
     // prints out undefined
我需要设置两个单独的页面,将用于整个应用程序加载不同的页面,并根据需要处理它们

现在,我可以通过将变量声明为“var”,然后在.then()中赋值来实现这一点。但我更愿意使用“const”作为最佳实践

下面的代码让我可以将其作为一个变量来执行,并在整个应用程序中使用:

const puppet = require('puppeteer')

async function setupNewPuppetWithKeys(puppetBrowser, puppetPage ){

  let browser = await puppet.launch();
  let page = await browser.newPage();
  page.setViewport({ width: 1280, height: 800 });

  logger.infoLog("initialized values for - " + puppetBrowser + ", " + puppetPage )
  return { [puppetBrowser] : browser , [puppetPage] : page };
}

var browserDev, pageDev;
setupNewPuppetWithKeys("browserDev", "pageDeV").then( (jsonResult) => {

   logger.infoLog("In Then received : " + util.inspect(jsonResult) );
   browserDev = jsonResult.browserDev;
   pageDev = jsonResult.pageDev;
} );

// I declare more browser and page variables here .. but you get the idea with the one I've done above.
,不支持顶级异步/等待。您可以创建一个“主”异步函数,您可以在顶级调用该函数:

const puppet = require('puppeteer')

async function main() {
  const browser = await puppet.launch();
  const page = await browser.newPage();

  console.log( "browser holds: " + util.inspect(page) );
}

main();
,不支持顶级异步/等待。您可以创建一个“主”异步函数,您可以在顶级调用该函数:

const puppet = require('puppeteer')

async function main() {
  const browser = await puppet.launch();
  const page = await browser.newPage();

  console.log( "browser holds: " + util.inspect(page) );
}

main();
您不需要定义独立的函数,而是将它们全部封装在异步函数中(因为await只能在异步函数中使用),现在您将获得所需的值


您不需要定义独立的函数,而是将它们全部封装在异步函数中(因为wait只能在异步函数中使用),现在您将获得所需的值。

谢谢@Seblor。感谢这个例子,但这不适用于我的用例。我的应用程序要大得多,我需要将其保持在全局级别/模块级别,以便将其传递给其他方法。请参阅我对may question所做的编辑,因为我已经添加了更多关于目前的解决方法的内容。@selbor。感谢您包含关于不支持顶级异步/等待的链接。很高兴知道。我将浏览该链接上的文档。现在,我想我正在使用的var方法将不得不这样做。我认为您应该将所有代码保存在函数中,并避免使用全局变量。如果你想继续这样工作,你可以用
let
而不是
var
。我同意你用“let”而不是“var”的建议。我尝试使用'let'而不是'var',在这里也可以这样做。这里进行全局/模块级声明的唯一原因是,我不必每次访问页面时都重新创建“浏览器”和“页面”。谢谢@Seblor。感谢这个例子,但这不适用于我的用例。我的应用程序要大得多,我需要将其保持在全局级别/模块级别,以便将其传递给其他方法。请参阅我对may question所做的编辑,因为我已经添加了更多关于目前的解决方法的内容。@selbor。感谢您包含关于不支持顶级异步/等待的链接。很高兴知道。我将浏览该链接上的文档。现在,我想我正在使用的var方法将不得不这样做。我认为您应该将所有代码保存在函数中,并避免使用全局变量。如果你想继续这样工作,你可以用
let
而不是
var
。我同意你用“let”而不是“var”的建议。我尝试使用'let'而不是'var',在这里也可以这样做。这里进行全局/模块级声明的唯一原因是,我不必每次访问页面时都重新创建“浏览器”和“页面”。谢谢@Sankhavaram。您可以使用Seblor提供的相同解决方案,但它不适用于我的用例。请看我对我的问题所做的编辑,因为我已经添加了更多关于为什么我希望将变量保持在全局级别的细节。谢谢@Sankhavaram。您可以使用Seblor提供的相同解决方案,但它不适用于我的用例。请看我对我的问题所做的编辑,因为我已经添加了更多关于为什么我希望将变量保持在全局级别的细节。