Phantomjs / Node.js - 重构代码块

Phantomjs / Node.js - Refactoring block of code

我正在为我工​​作的公司编写测试应用程序,使用 Node.js 和 Phantomjs。现在,我的代码的相关部分是这样的:

phantom.create(function (ph) {
        ph.createPage(function (page) {
                page.set('viewportSize', { width: 1920, height: 1080 });
                page.set('settings.javascriptEnabled', true);
                page.set('settings.loadImages', true);
                page.set('settings.localToRemoteUrlAccess', true);
                page.set('settings.userAgent', userAgentStrings[randomInt(0, 5)]);
                page.set('settings.webSecurityEnabled', false);
                page.set('settings.resourceTimeout', 5000);

                page.open(URL, function (status) {
                        if (status == 'success') {
                                page.evaluate(function (result) {
                                        return document.title;
                                }, function (result) {
                                        setTimeout(function () {
                                                log.info('Status: ', status);
                                                ph.exit();
                                        }, 60 * 1000);
                                });
                        } else if (status == 'fail') {
                                log.error('Status: ', status);
                                ph.exit();
                        }
                });
        });
});

我的问题是:有没有一种方法可以重构我的代码,使我可以从 "phantom.create(..." 块外部调用 "page.open(..." 函数?

我计划实施 node-cron 并有一个代码块用于设置页面的所有选项,另一个代码块用于打开页面。最终,开场部分将交由node-cron处理,无限重复。

这是一个关于如何执行此操作的简单示例。您只需要将幻影对象存储在某个地方并重新使用它。请注意,我将其简化,以便您可以重用该概念,但您将需要更多的错误处理。

var jobRunner = function() {
  // The phantom object will be stored here
  this.ph;

  // The page object will be stored here
  this.page;
};

jobRunner.prototype.start = function(readyCallback) {
  var self = this;

  phantom.create(function (ph) {
    self.ph = ph;
    self.ph.createPage(function (page) {
      page.set('viewportSize', { width: 1920, height: 1080 });
      page.set('settings.javascriptEnabled', true);
      page.set('settings.loadImages', true);
      page.set('settings.localToRemoteUrlAccess', true);
      page.set('settings.userAgent', userAgentStrings[randomInt(0, 5)]);
      page.set('settings.webSecurityEnabled', false);
      page.set('settings.resourceTimeout', 5000);

      self.page = page;
      readyCallback();
    });
  });
};

jobRunner.prototype.doUrl = function(url) {
  var self = this;
  this.page.open(URL, function (status) {
    if (status == 'success') {
      page.evaluate(function (result) {
        return document.title;
      }, function (result) {
        setTimeout(function () {
          log.info('Status: ', status);
          self.ph.exit();
        }, 60 * 1000);
      });
    } else if (status == 'fail') {
      log.error('Status: ', status);
      self.ph.exit();
    }
  });
}

var CronJob = require('cron').CronJob;
var phantomJob = new jobRunner();

// Wait for Phantom to be ready then start the Cron Job.
phantomJob.start(function() {
  var cron = new CronJob('*/5 * * * * *', function() {
    phantomJob.doUrl("http://yoururl.com");
  });
});