[英]Phantom.js callback Reference errors when refactoring Phantom.js on Node.js/Express.js to avoid “callback hell”
我有這個瘋狂的大功能代碼塊,但是我希望可以正確地重構它。 根據Callback Hell ,我試圖將其分解為非匿名函數,並將這些函數與中央代碼分開。
但是,我遇到了一個問題,代碼的許多不同部分都依賴於將其他部分用作參數。 我在序列中收到的第一條錯誤消息是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
您需要傳遞函數,而不是調用它們:
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);
*/
您的代碼中沒有status
, linkArray
或result
值-它們是函數定義的參數 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.