在重构Node.js / Express.js上的Phantom.js时,Phantom.js回调引用错误以避免“回调地狱”

时间:2014-10-29 14:15:26

标签: javascript jquery node.js

我有这个疯狂的大块代码功能,但我希望能够正确地重构。根据{{​​3}},我试图将其分解为非匿名函数,并从中央代码中分离出这些函数。

但是,我遇到的问题是代码的很多不同部分都依赖于使用其他部分作为参数。我在序列中收到的第一条错误消息是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();
}

我如何传递各种依赖项,例如pagestatus,因为我尝试过传递页面但后来又出现了另一个错误ReferenceError: document is not defined

1 个答案:

答案 0 :(得分: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);
*/

代码中没有statuslinkArrayresult值 - 它们是函数定义的参数