使用Nightmare.js,无需ES6语法和yield

2024-03-03

我使用 Nightmare.js 构建了一个简单的节点脚本来抓取网站

var Nightmare = require('nightmare');
var vo = require('vo');

vo(run)(function(err, result) {
    if (err) throw err;
});

function *run() {
    var x = Date.now();
    var nightmare = Nightmare();
    var html = yield nightmare
    .goto('http://google.com')
    .evaluate(function() {
        return document.getElementsByTagName('html')[0].innerHTML;
    });

    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);

    yield nightmare.end();
}

我想在使用旧版本节点的环境中运行它,该版本不支持 ES6 功能。 github 页面上没有关于如何在没有“yield”关键字的情况下执行此操作的示例。

我确实在这里找到了一个没有 ES6 语法的用法示例:噩梦般的网页抓取 https://azurelogic.com/posts/web-scraping-with-nightmare-js/

我是这样写的:

var night = new Nightmare()
.goto('http://www.google.com')
.evaluate(function () {
  return document.getElementsByTagName('html')[0].innerHTML;
},function (html) {
   console.log("result", html);
  }
)
.run(function (err, nightmare) {
  if (err) return console.log(err);
  console.log('Done!');
});

它不会崩溃,但结果记录函数永远不会被调用。

使用yield语法,从“evaluate”获取返回值非常简单,但是没有它,我没有找到任何方法来做到这一点。

UPDATE感谢已接受的答案及其评论而写下此文。它使用“Q”并适用于 0.12 之前的节点版本:

var Nightmare = require('nightmare');

var Promise = require('q').Promise;

var x = Date.now();
var nightmare = Nightmare();
Promise.resolve(nightmare
  .goto('http://google.com')
  .evaluate(function() {
      return document.getElementsByTagName('html')[0].innerHTML;
})).then(function(html) {
    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);
    return nightmare.end();
}).then(function(result) {

}, function(err) {
   console.error(err); // notice that `throw`ing in here doesn't work
});

这些文档很糟糕,但 Nightmare 似乎是基于 thenables 的。我也没有找到太多关于回调接口的信息,但这无论如何都会导致缩进金字塔。

所以你最好的选择是使用承诺,只需选择任何图书馆 https://promisesaplus.com/implementations大致遵循 ES6 标准(它们也可以在非 ES6 环境中使用)。

您可以轻松地将线性生成器代码转换为承诺链,只需替换每个yield by a then call:

var Nightmare = require('nightmare');
var Promise = require('…');

var x = Date.now();
var nightmare = Nightmare();
Promise.resolve(nightmare
  .goto('http://google.com')
  .evaluate(function() {
      return document.getElementsByTagName('html')[0].innerHTML;
})).then(function(html) {
    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);
    return nightmare.end();
}).then(function(result) {
    …
}, function(err) {
   console.error(err); // notice that `throw`ing in here doesn't work
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Nightmare.js,无需ES6语法和yield 的相关文章

随机推荐

  • 所有虚函数都需要在派生类中实现吗?

    这似乎是一个简单的问题 但我在其他地方找不到答案 假设我有以下内容 class Abstract public virtual void foo 0 virtual void bar class Derived Abstract publi
  • 加载位图图像后,Jetpack compose (Glance) 小部件不会重新组合

    我正在尝试使用具有 SVG 图像支持的 Glance Jetpack 创建一个 Appwidget 我可以使用下载位图 ImageRequest Builder this data url decoderFactory SvgDecoder
  • 如何在django中的同一页面上拆分帖子视图

    我不知道这个问题是否有意义 但我对此感到很困惑 我有一个帖子列表视图 它正在此处呈现一些帖子 My question is how can I split the sections of the page something like th
  • 使用字母数字模式将 URL 编码为 QR 码?

    我需要为我的网址构建一个尽可能小的二维码 它足够短以使用缩短器 并且我不想依赖它们的可靠性 HTTP SUBDOM DOMAIN EU 8位字节模式太浪费地方了 我在那里可以到达版本2 但是版本1在字母数字模式 有没有办法将字母数字模式设置
  • 将现有 MATLAB 绘图绘制到另一个图形中

    我使用绘图命令绘制图形 然后使用设置命令更改其许多属性 我还存储了绘图的句柄 例如 h1 我需要的是稍后在我的代码中使用句柄再次绘制相同的图形 我检查了plot命令 没有找到任何接受句柄的版本 我还考虑获取 Xdata 和 Ydata 并使
  • 使用对话框完成 AJAX 调用后如何重新加载页面?

    因此 一旦用户单击打开的链接 我就会有一个带有表单的对话框用户界面 一旦他们单击 添加按钮 它就会创建一个 AJAX 调用 将数据提交到数据库中 我需要添加的是 reload 函数来刷新页面 如何添加重新加载功能 我尝试添加 windows
  • 当光标位于子组件上时,JPanel 不生成 MouseEvents

    这对我来说有点奇怪 但是当光标位于 JTextField 和 JToolBar 子组件上时 JPanel 不会生成 MouseEvents 但当光标位于 JLabel 上时 它会生成 MouseEvents 有人可以解释我为什么吗 有没有办
  • 如何将字符串从原生 iOS 插件返回到 unity?

    我正在创建一个 iOS 插件 它需要向 Unity 返回一个字符串 或 const char 我该如何实施 我想澄清一下之前的答案 C 声明 DllImport Internal private static extern string g
  • Grails 自动编译不在开发环境中

    我在一个名为 本地 的环境中运行 Grails 2 1 因为 开发 是为临时系统保留的 但我希望必须像在开发模式下一样自动编译 即如果我要更改控制器 则更改将被一次编译而无需重新运行 run app 参数 grails gsp enable
  • cordova 运行时出现 ios 错误..命令的错误代码 65:带有参数的 xcodebuild:

    This 仅发生错误当我尝试cordova run ios device 即使cordova build ios执行命令 没有报错 我做错了什么 以及如何在我的 iPhone 上调试 cordova 项目 需要这个 因为需要测试相机功能 W
  • pymysql,查询期间失去与MySQL服务器的连接

    查询期间与 MySQL 服务器的连接丢失 如何解决此问题 最好在我的程序中解决这个问题 import pymysql connection pymysql connect host user password db charset utf8
  • 获取 C++0x 随机数生成器状态的标准方法是什么?

    我正在尝试学习随机数生成器的新 C 0x 方法 26 5 并在符合 C 0x 的随机数引擎 26 5 1 4 上实现 该标准详细介绍了种子序列所需的接口 以及如何将它们传递给构造函数或seed发动机的功能 但是 我找不到任何标准接口来从引擎
  • 数据库复制还是镜像?

    SQL Server 2005 中的复制和镜像有什么区别 简而言之 镜像允许您让第二台服务器成为主服务器的 热 备用副本 随时准备在主服务器发生故障时接管 因此镜像提供了故障转移和可靠性 另一方面 复制允许两个或多个服务器保持 同步 这意味
  • iPhone App Objective C 中的 SimpleXML 解析方式

    我一直想知道是否有一种方法可以像在 PHP 中解析 SimpleXML 一样轻松地在 Objective C 中解析 XML 我所知道的唯一现有方法如下 使用 NSXMLParser 并创建委托来处理遇到 XML 元素 值等时触发的事件 使
  • liquibase“splitStatements”有什么好处?

    正在使用的 liquibase 版本 org liquibase liquibase core 3 8 2 不是专业版 Liquibase 文档 1 https docs liquibase com change types sql htm
  • iPhone 模拟器不显示启动画面

    要在基于视图的应用程序中显示启动屏幕 我所要做的就是将图像拖到资源文件夹中并将其命名为default png 对吗 这就是我所做的 但图像没有显示 添加它时 您是否告诉它复制到输出位置 这是添加后出现的对话框上的一个复选框 尝试阅读并确保选
  • 检查文件是否是有效的 SQLite 数据库

    我需要检查文件 扩展名未知 是否是有效的 SQLite 数据库 我的函数工作正常 但是当失败时 退出函数后文件仍然被锁定 Public Function IsSqliteDB ByVal uPath As String As Boolean
  • ModuleNotFoundError:没有名为“import_export”的模块

    我用过以下tutorial https django import export readthedocs io en latest installation html 我使用了命令pip install django import expo
  • 将 -inf 替换为零值

    我有一个数组 x numpy array inf inf 37 49668579 有没有办法将 inf 值更改为 0 有 from numpy import inf x x inf 0
  • 使用Nightmare.js,无需ES6语法和yield

    我使用 Nightmare js 构建了一个简单的节点脚本来抓取网站 var Nightmare require nightmare var vo require vo vo run function err result if err t