2014-07-14 1 views
0

내 순진하게 접근 방식은 루프컬렉션을 통해 ZombieJS + NodeJS를 실행하는 방법은 무엇입니까? 항목의 거대한 배열을 통해 루프 ZombieJS를 얻을 수

var Browser = require("zombie"); 
var assert = require("assert"); 

// Load the page from localhost 
browser = new Browser() 
browser.visit("http://localhost:3000/", function() { 

    // Fill email, password and submit form 
    browser. 
    fill("email", "[email protected]"). 
    fill("password", "eat-the-living"). 
    pressButton("Sign Me Up!", function() { 

     // Form submitted, new page loaded. 
     assert.ok(browser.success); 
     assert.equal(browser.text("title"), "Welcome To Brains Depot"); 

    }) 

}); 

내 안에 다음 코드를 추가했지만 오류가 모든 종류는 계속되었다. 특히 100 번째 항목을로드하려고 시도한 후 메모리 오류가 발생했습니다.

내가 뭘 잘못하고 있니? 루프를 반복 할 때마다이 코드를 실행하고 성공적인 시도가있을 때마다 리소스를 정리할 수 있었으면 좋겠습니다. 만약 그랬다면, 난이 방문하는 URL의 대기열을 만들 것

+0

당신은 효과적으로 동시에 모든 항목을 방문하는 브라우저를 말하려고하고 있습니다. 'pressButton' 후에 콜백 때까지 다음'.visit()'를 호출하지 마십시오. – Brad

+0

for 루프 안에서 어떻게 할 수 있습니까? – Draconar

+0

방금 ​​답변을 올렸습니다. 아래를 참조하십시오. – Brad

답변

1

...

var urls = ['http://example.com/something', 'http://example.com/somethingElse', /* etc. */] 

그럼,이 큐에서 읽는 기능을 만들 것입니다.

function runNextJob() { 
    if (!urls.length) { 
     return; // W're done! 
    } 

    var url = urls.pop(); 
    browser.visit(url, function() { 
     // yada yada 
     browser.pressButton('Sign Me Up!', function() { 
      // On next tick, call runJext Job(). It's important that 
      // this is next tick! Otherwise our call stack gets enormous. 
      process.nextTick(runNextJob); 
     } 
    } 
} 

사이클을 시작하려면 runNextJob()을 한 번 호출하십시오. 한 번에 여러 개를 실행하려면 동시 작업을 원하는만큼이 기능을 실행하십시오. (예를 들어, browser이 작업을 수행하지만 실험을 할 것입니다 방법에 따라 4 CPU 박스에 4 회,.)

관련 문제