如何在全局范围内创建async / await

时间:2018-05-19 12:30:45

标签: javascript async-await puppeteer

我想使用一个具有等待的全局变量,如下所示:

(async () => {
  const browser = await puppeteer.launch({headless: false})
  const page = await browser.newPage();
})()

后来在我的所有功能上使用它:

async function login() {

  await page.goto(urls.login);
  await page.type('#username', user);
  await page.type('#password', pw);
  page.click('[type="submit"]');
  await page.waitForNavigation();

}

运行它我收到此错误:

  

ReferenceError:未定义页面。

有一些方法可以让它发挥作用吗?

2 个答案:

答案 0 :(得分:1)

将promise存储在全局变量中:

const pagePromise = (async () => {
  const browser = await puppeteer.launch({headless: false})
  return browser.newPage();
})();

然后您可以稍后使用它

async function login(page) {
  await page.goto(urls.login);
  await page.type('#username', user);
  await page.type('#password', pw);
  page.click('[type="submit"]');
  await page.waitForNavigation();
}
pagePromise.then(login).catch(console.error);

async function login() {
  const page = await pagePromise;
  await page.goto(urls.login);
  await page.type('#username', user);
  await page.type('#password', pw);
  page.click('[type="submit"]');
  await page.waitForNavigation();
}
login().catch(console.error);

答案 1 :(得分:-1)

这里的解决方案: https://github.com/tc39/ecmascript-asyncawait/issues/9

(async () => {
const browser = await puppeteer.launch({headless: false})
const page = await browser.newPage()

async function login() {

    await page.goto(urls.login, {waitUntil: 'networkidle2'});
    await page.type('#user', user);
    await page.type('#password', pw);
    await page.click('[type="submit"]');
    await page.waitForNavigation();
    await page.screenshot({path: 'after-login.png'});
}

login();

})()