2014-10-29 99 views
0

我有这个疯狂的大块代码,但我希望能够正确地重构代码。根据Callback Hell,我试图将其分解为非匿名函数,并将这些函数与中央代码分离。Phantom.js回调参考错误重构Node.js/Express.js上的Phantom.js,以避免“回调地狱”

但是,我遇到了代码的很多不同部分依赖于使用其他参数作为参数的问题。我的序列中接收到的第一错误消息ReferenceError: page is not defined

将未重构的代码是:

function startMyFunction(firstLayerUrl) { 
     phantom.create(function (ph) { 
      ph.createPage(function (page) { 
       var main_file=firstLayerUrl 
       page.open(main_file, function (status) { 
        var linkArray=[]; 
        page.evaluate(function (linkArray) { 
         for (var i=0; i < document.getElementsByTagName('a').length; i++) { 
          linkArray.push(document.getElementsByTagName('a')[i].href) 
         } 
         return linkArray; 
        } 
        , function finished(result) { 
         linkArray = result; 
         runEmailLoop(linkArray); 
         page.close() 
         ph.exit(); 
        },linkArray); 
       }); 
      }); 
     }, { 
      dnodeOpts: { 
       weak: false 
      } 
     }); 
} 

尝试的重构的代码是:

function runFirstLayer(firstLayerUrl) { 
    phantom.create(function (ph) { 
     ph.createPage(function (page) { 
      var main_file=firstLayerUrl 
      page.open(main_file, openIndexPage(status)); 
     }); 
    }, { 
     dnodeOpts: { 
      weak: false 
     } 
    }); 
} 

function openIndexPage (status) { 
    var linkArray=[]; 
    page.evaluate(evaluatePage(linkArray), finished(result),linkArray); 
} 

function evaluatePage(linkArray) { 
    for (var i=0; i < document.getElementsByTagName('a').length; i++) { 
     linkArray.push(document.getElementsByTagName('a')[i].href) 
    } 
    return linkArray; 
} 

function finished(result) { 
    linkArray = result; 
    runEmailLoop(linkArray); 
    page.close() 
    ph.exit(); 
} 

我怎样才能上通过各种依赖,例如page,status,因为我试过了页面但是又得到另一个错误ReferenceError: document is not defined

+0

这个问题似乎是脱离主题,因为它属于codereview.stackexchange – 2014-10-29 14:17:56

+1

@GeorgeJempty:不,它没有。代码不起作用。 – Bergi 2014-10-29 14:19:25

+0

我在标题中进行了“重新考虑”。重构是改进* working *代码的过程。我的投票结果可能是错误的,但你也可能想考虑改进问题标题。 – 2014-10-29 15:32:01

回答

0

你需要的功能,而不是叫他们:

page.open(main_file, openIndexPage); 
/* instead of 
page.open(main_file, openIndexPage(status)); 
*/ 

page.evaluate(evaluatePage, finished, linkArray); 
/* instead of 
page.evaluate(evaluatePage(linkArray), finished(result),linkArray); 
*/ 

有在你的代码没有statuslinkArray,或result值 - 他们是参数函数定义。

+0

我传递了函数,删除参数,正如你所说的,但我仍然在'openIndexPage'内收到'page is not defined'的错误信息: http://jsfiddle.net/xhx7ggLf/1/ – maudulus 2014-10-29 14:39:40

+0

你有没有考虑过使用http://www.nightmarejs.org/。它是PhantomJS上的更高级别的API来避免这种问题。 – codemonkey 2014-10-29 16:15:28

+0

@codemonkey我最初希望能够使用nightmarejs,但不幸的是,因为“weak”模块,我的系统上出现了一些乱七八糟的东西,所以我需要在所有的模块中包含'dnodeOpts:{weak:false}'我的幻影页面打开,但我感谢您的评论,特别是考虑到一年中的时间。 – maudulus 2014-10-29 17:22:40