前言:

这两天在使用puppeteer编写脚本的时候,报了一个错,Evaluation failed: ReferenceError: __awaiter is not defined,花了大概1天多时间把这个问题给解决了.

前因:

我在项目中编写了一段ts的代码:

async function scrollPageCustom(page: any, elementSelect?: any) {return await page.evaluate((elementSelect: any) => {return new Promise(async (resolve, reject) => {const height = document.querySelector(elementSelect).scrollHeight;const delay = (ms: number) =>new Promise((resolve) => setTimeout(resolve, ms));console.log(height);for (let i = 0; i < height - 600; i += 200) {await delay(200);document.querySelector(elementSelect).scroll(0, i);// window.scroll(0, i);}resolve("success");});}, elementSelect || "html");
}

这段代码是自动滚动打开的页面,我需要把这个代码编译成js后,再重新在浏览器中跑,当我使用ts的代码的时候,这段代码是可以正常运行的,但是等我使用命令tsc 编译命令后,却报错了. 编译过程出了什么问题?

查看编译后的代码:

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }return new (P || (P = Promise))(function (resolve, reject) {function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }step((generator = generator.apply(thisArg, _arguments || [])).next());});
};
var __generator = (this && this.__generator) || function (thisArg, body) {var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;function verb(n) { return function (v) { return step([n, v]); }; }function step(op) {if (f) throw new TypeError("Generator is already executing.");while (_) try {if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;if (y = 0, t) op = [op[0] & 2, t.value];switch (op[0]) {case 0: case 1: t = op; break;case 4: _.label++; return { value: op[1], done: false };case 5: _.label++; y = op[1]; op = [0]; continue;case 7: op = _.ops.pop(); _.trys.pop(); continue;default:if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }if (t[2]) _.ops.pop();_.trys.pop(); continue;}op = body.call(thisArg, _);} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };}
};
exports.__esModule = true;
var delay = function (ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); };
function scrollPageCustom(page, elementSelect) {return __awaiter(this, void 0, void 0, function () {var _this = this;return __generator(this, function (_a) {switch (_a.label) {case 0: return [4 /*yield*/, page.evaluate(function (elementSelect) {return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {var height, delay, i;return __generator(this, function (_a) {switch (_a.label) {case 0:height = document.querySelector(elementSelect).scrollHeight;delay = function (ms) {return new Promise(function (resolve) { return setTimeout(resolve, ms); });};console.log(height);i = 0;_a.label = 1;case 1:if (!(i < height - 600)) return [3 /*break*/, 4];return [4 /*yield*/, delay(200)];case 2:_a.sent();document.querySelector(elementSelect).scroll(0, i);_a.label = 3;case 3:i += 200;return [3 /*break*/, 1];case 4:resolve("success");return [2 /*return*/];}});}); });}, elementSelect || "html")];case 1: return [2 /*return*/, _a.sent()];}});});
}

从代码中可以看到确实声明了__awaiter,那为什么还是报了 is not defined这个错误呢?

问题原因:

因为puppeteer在运行页面的时候,并不会把__awaiter代入,在page执行滚动操作的时候,其实是形成了一个闭包,无法读取到外部的变量,所以如果你要在page中使用到这个__awaiter,则需要另外传参,把__awaiter以参数的形式传入.

解决:

为什么会出这个问题找到了,那么解决问题的方式就简单了,因为我的这个文件编译是单独的,所以这个函数我可以单独传入. 另外一种方式就是在page中执行的时候不要有到async,await即可

总结:

虽然是一个小问题,但是还是饶了我很多路,刚开始我以为是编译的问题,以为浏览器不支持es6的语法,所以在编译的时候加了参数,结果也还是会报错. 还是那个声明的__awaiter误导了我啊!

puppeteer开发中Evaluation failed: ReferenceError: __awaiter is not defined 报错处理相关推荐

  1. Python 解决execjs._exceptions.ProgramError: ReferenceError: document is not defined报错问题

    今天用execjs调用JS时,发现报错execjs._exceptions.ProgramError: ReferenceError: document is not defined 如图: 错误类型 ...

  2. Open3D中出现NameError: name ‘o3dtut‘ is not defined报错

    主要因为open3d_tutorial.py 是官方程序中写好的文件.因为没有下载官方程序,所有会出现报错,如果不下载官方文件只需要在自己的程序内,加入以下代码: class o3dtut:def g ...

  3. 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )

    文章目录 一.从 Tombstone 报错日志中查找报错动态库 二.addr2line 命令行工具使用 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工 ...

  4. ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法

    MySQL中Multiple primary key defined报错的解决办法 创建主键可以有两种方式: create table 表名( 字段名 类型, 字段名 类型, -- primary k ...

  5. GitLabCICD实战----在.gitlab-ci.yml文件的步骤中使用git clone 另一个代码仓报错的解决办法

    更多信息请关注 个人网站 一.背景 在有些时候,比如在一个项目中,产品的代码是java代码仓,自动化测试脚本是python语言,单独存放的代码仓,在使用GitlabCICD构建流水线的时候有这样一种场 ...

  6. react 中使用import()实现按需加载报错 解决方法 --‘import’ and ‘export’ may only appear at the top level

    react 中使用import()实现按需加载报错 解决方法 --'import' and 'export' may only appear at the top level 参考文章: (1)rea ...

  7. IDEA中写代码间距变大报红,报错Cannot resolve symbol

    问题: IDEA中写代码间距变大报红,报错Cannot resolve symbol 原因: 出现这个情况是因为输入法中英文设置成了全角 解决: 将输入法设置成半角即可 1.切换到中文状态 2.shi ...

  8. 开发避坑2——大鸟 pk Bug2(SVN报错:database disk image is malformed

    开发避坑2--大鸟 pk Bug2(SVN报错:database disk image is malformed) 报错信息 svn报错database disk image is malformed ...

  9. phpstudy访问不了php_初接触php,使用phpstudy运行php文件,访问路径中不能携带.php尾缀,否则报错...

    使用phpstudy运行php文件,路径中不能携带.php尾缀,否则报错 直接使用one可以访问,这个是控制层出问题吗 这个是控制层代码 class one extends General_contr ...

最新文章

  1. the next journal submission for mechanism should be at this journal
  2. python示例_带有示例的Python功能指南
  3. c语言输入四个成绩求最高分最低分,数组实现学生成绩录入、求最高分、最低分、平均分和排序...
  4. Android 驱动(12)---Linux DTS(Device Tree Source)设备树详解
  5. [计算机网络] - 从英雄联盟,看数据包何去何从?
  6. 作业 3 应用分支与循环结构解决问题 计算分段函数的值
  7. 第十届全国大学生光电设计大赛分析前瞻(一文看懂光电设计大赛创意赛,做好准备)
  8. java 画趋势图,java画曲线图
  9. 神经网络之输出层设计
  10. 1、spring之Resource加载
  11. 作业中关于H5中动画的实现——animation
  12. 自制一个简单的音乐播放器
  13. SAP中参照采购协议发票校验时带出价格与协议当前价格不一致的案例分析
  14. HAL库自学笔记#2【PWM】
  15. mac 用户 文件夹 权限_Mac修改账户名称和个人目录后,进不去系统怎么办?
  16. 发表SCI有什么好处?如何发表一篇SCI论文?
  17. 开源工具 — 有了这款免费的开源作图工具,我放弃了Visio
  18. webmatrix安装_指南:使用Microsoft WebMatrix进行WordPress开发
  19. Tomcat中间件版本信息泄露
  20. soap和wsdl区别说明

热门文章

  1. 大学英语B116-完形填空
  2. 实验任务(三)---密码破解技术
  3. ubuntu 16.04执行apt-get update失败卡住的解决方法
  4. leetcode数据库题目1-123题(20-08-14)(1)
  5. Keycloak实现手机验证码登录
  6. vue+django2.0.2-rest-framework 生鲜项目(三)
  7. 微信气泡主题设置_米老鼠微信主题怎么设置? 米老鼠微信主题气泡设置教程来啦!...
  8. 【DockerCE】onlyoffice从7.2 版本开始默认启用JWT
  9. TFN高性能无线电综合测试仪让测试更加精准
  10. 独特的电子邮箱地址-LeetCode练习(Java实现)