2014-10-29 2 views
0

У меня есть этот сумасшедший большой блок кода, который функционирует, но который я надеюсь правильно реорганизовать. В соответствии с Callback Hell я попытался разбить его на не анонимные функции и отделить эти функции от центрального кода.Обратный вызов Phantom.js Исходные ошибки при рефакторинге Phantom.js на Node.js/Express.js, чтобы избежать «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

+0

Этот вопрос не соответствует теме, потому что он принадлежит на codereview.stackexchange –

+1

@GeorgeJempty: Нет, это не так. Код не работает. – Bergi

+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); 
*/ 

Там нет status, linkArray или result значения в коде - они параметры из определения функций.

+0

Я передал функции, удалив параметры, как вы сказали, но я все еще получаю сообщение об ошибке' страница не определена' внутри 'openIndexPage': http://jsfiddle.net/xhx7ggLf/1/ – maudulus

+0

Считаете ли вы использование http://www.nightmarejs.org/. Это API более высокого уровня над PhantomJS, чтобы избежать такой проблемы. – codemonkey

+0

@codemonkey Я надеялся использовать ночные кошмары изначально, но, к сожалению, не смог из-за модуля «слабый», и что-то перепуталось с моей системой, так что мне нужно включить 'dnodeOpts: {weak: false}' после того, как все открывается моя фантомная страница, но я благодарю вас за комментарий, особенно учитывая время года. – maudulus

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