【问题标题】:Nightmare Looping噩梦循环
【发布时间】:2017-12-13 02:24:50
【问题描述】:

你好,我正在编写一个应用程序,我需要能够遍历一组 url。我知道有一个如何做到这一点的例子,但我的问题有点不同,我会用一些代码来解释。

nightmare
  .goto('some url')
  .evaluate(() => {
    //evaluate code
  })
  .then(dataArray => {
    var innerRun = function* () {
      var returnData = [];
      for (var i = 0; i < dataArray.length; i++) {
        var item = dataArray[i];
        yield nightmare
          .goto(item.url)
          .evaluate(function () {
            return false;
          })
          .screenshot(item.imgPath)
        returnData.push(item);
      }
      return returnData;
    }
    vo(innerRun)(function (err, ads) {
      if (err) {
        console.log("Error running", err)
        return;
      }
    });
  });

我希望能够通过使用 url 数组来循环该代码。我相信我在实现这一点时遇到了问题,因为我已经在then 中这样做了。一旦碰到then 内的yield nightmare,它将停止运行

var mainLoop = function* () {
  for (var j = 0; j < urlArray.length; j++) {
    var url = urlArray[j];
    yield nightmare.goto(url)//same code as in example above
  }
}

vo(mainLoop)(function (err, d) {
  if (err) {
    console.log("Error running", err)
    return;
  }
});

上面的代码是我试图做的。如果有人有任何想法,那将是一个巨大的帮助,谢谢!

【问题讨论】:

  • 运行所有这些请求有什么要求?你想一个接一个地连续运行它们。尽可能多地并行?全部并行?而且,期望的最终结果是什么?一组快照?如果您在途中遇到错误,您想怎么做 - 停止并报告错误,跳过错误并继续其他错误?
  • 如果可能的话,我希望尽可能多地并行运行。由于噩梦实例,我认为您需要一个接一个地执行,但是如果它们可以并行运行,那就太好了。最终结果是保存快照并记录 vo(innerRun) 返回的 innerData 数组。如果出现错误,我想记录此错误,但请继续。

标签: node.js nightmare


【解决方案1】:

不妨试试这个:

var urls = ['http://example.com', 'http://example2.com', 'http://example3.com'];

var results = [];
urls.forEach(function(url) {
  nightmare.goto(url)
    .wait('body')
    .title()
    .then(function(result) {
      results.push(result);
    });
});
console.dir(results)

来源:https://github.com/rosshinkley/nightmare-examples/blob/master/docs/common-pitfalls/async-operations-loops.md

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2020-03-14
    • 2010-11-13
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多