2014-10-29 74 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