Puppeteer启动的browser在try-catch块外无法访问问题解析
为什么try块内定义的
browser变量在块外无法访问? 这是JavaScript块级作用域的规则导致的:
- 你在
try块里用const browser = await puppeteer.launch()声明变量,const(包括let)声明的变量属于块级作用域——它们的有效范围只限于包裹它们的那个{}代码块(这里就是try块)。一旦跳出这个块,外部就找不到这个变量了,所以你在try-catch外面调用browser时,会直接抛出ReferenceError。 - 对比你用的
var cnt_pages,var是函数级作用域,所以在整个async函数里都能访问,但browser是const声明的,不受这个规则影响。 - 报错里的
UnhandledPromiseRejectionWarning,是因为async函数里的代码抛出了未捕获的错误(找不到browser),Promise被拒绝但没处理,所以触发了警告。
修复方案
把browser的声明提升到try块外面,放到整个async函数的作用域里:
"use strict"; const puppeteer = require("puppeteer"); (async () => { let browser; // 先在函数作用域声明变量 try { browser = await puppeteer.launch(); console.log(`browser=${browser}`); var cnt_pages = (await browser.pages()).length; console.log(`${cnt_pages} pages`); } catch (error) { console.error(error); console.error(`can not launch`); process.exit(); } console.log(`browser=${browser}`); var cnt_pages = (await browser.pages()).length; console.log(`cnt_pages ${cnt_pages}`); // 注意:Node.js没有全局input函数,需替换为readline模块或其他交互方式 })();
这样browser变量的作用域覆盖整个async函数,不管是try块内还是外面都能正常访问。
内容的提问来源于stack exchange,提问作者SKulibin
相关产品推荐
相关产品推荐

