2015-04-02 4 views
0

Я пишу тестовое приложение для компании, где я работаю, используя Node.js и Phantomjs. Существует способ, чтобы реорганизовать свой код таким образом, что я могу назвать «page.open (..: Прямо сейчас, соответствующая часть моего кода что-то вроде этого:Phantomjs/Node.js - блок рефакторинга кода

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 (... "block?

Я планирую реализовать узел-cron и иметь один блок кода, где я настроил все параметры страницы, а другой на самом деле использовать для открытия страницы. В конце концов, открывающая часть будет обрабатываться узлом-cron, повторяющимся до бесконечности.

+0

Вопрос в том, почему вы хотите это сделать? Считаете ли вы, что вы сохраняете некоторые ресурсы из-за этого или думаете, что вы улучшаете время отклика? Я думаю, что вы не достигнете ни того, ни другого. –

ответ

2

Вот краткий пример того, как это сделать. Вам просто нужно сохранить свой фанто m где-то и повторно использовать его. Имейте в виду, что я сделал это просто, чтобы вы могли повторно использовать концепцию, но вам понадобилось бы больше обработки ошибок.

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"); 
    }); 
}); 
+0

Прежде всего, спасибо за отличный ответ. Теперь не могли бы вы рассказать о том, какую обработку ошибок я мог бы реализовать? Вам кажется, что я мог бы использовать совет. – dsljanus

Смежные вопросы