2017-10-25 10 views
0

그래서 나는 URL을각 반복에서 변수를 전달하는 동안 기수 인스턴스를 반복하는 방법은 무엇입니까?

의 배열에 저장된 각 링크에서 모든 HTML을 끌어 자바 스크립트 사용 horseman.js에서 스크립트

기본 개념은 다음과 로그 하나 개의 URL의 HTML을 잘

무엇을 쓰기 위해 노력하고 있어요 이제 예를

var result = ""; 
var pulledHtml = ""; 
var website = ["www.example1.com","www.example2.com"]; //(etc) 
var horseman = new Horseman(); 



    for (var i = 0; i < website.length; i++) { 
    horseman 
     .open(website) 
     .html() 
     .then(function(html){ 
     pulledHtml = html; 
     result += pulledhtml; 
     return result; 
     }) 
     .log() 
     .close(); 
    } 
console.log(result); 

은이

내가 생을 알고 내가 루프 때

var Horseman = require('node-horseman'); 

var result = ""; 
var pulledHtml = ""; 

var horseman = new Horseman(); 
horseman 
    .open(website) 
    .html() 
    .then(function(html){ 
    pulledHtml = html; 
    result += pulledhtml; 
    return result; 
    }) 
    .log() 
    .close(); 
    console.log(results); 

문제는 온다 루프가 운 좋게도 문제가되지 않는다는 것입니다. 위의 코드에서이 문제를 해결하는 방법에 대한 좋은 이해를 얻으 려합니다.

문제는 다음과 같습니다. 1) for 루프는 동기화 대 기수가 비동기가되어서 for 루프가 현재 URL에서 html을 가져 오기 전에 기수를 다시 호출합니다.

2.) 내가 새 변수를 찾을 때 가장 좋은 방법을 찾지 못하는 것처럼 보입니다. 내가 잘하고 있지 않다는 것을 확신한다. (최종 목표는 모든 HTML을 하나의 변수에 저장하는 것이다.)

나는 첫 번째 문제를 해결하기 위해 지금까지 시도했다.

var chain = horseman 

for(var i = 1; i < website.length; i++) { 

chain = horseman 
      .open(website) 
      .html() 
      .then(function(html){ 
      pulledHtml = html; 
      result += pulledhtml; 
      return result; 
      }) 
      .log() 
      .close(); 
} 

하지만 난 아무것도 반환하지 않습니다 루프 후 결과를 console.logging 등이 하나를 테스트 할 수있는 좋은 방법이없는

그러나,이 (나중에 결과 변수로 일을합니다) 을 console.log 그냥 즉시

마지막 루프 예를 들어 운명 내가 아무 소용이 여전히

async.each(website, function(item, callback) { 
    horseman 
    .open(website) 
    .html() 
    .then(function(html){ 
    pulledHtml = html; 
    result += pulledhtml; 
    return result; 
    }) 
    .log() 
    .close(); 
    callback(); 
}); 
    console.log(result); 

을 시도에 같이 빈 결과 변수를 반환하지 않는 한, 기다릴 나타납니다

누군가가 나를 도와 줄 수 있다면 많은 감사드립니다!

답변

0

나는이 Horseman API를 모르지만 .then() 기능을 사용하기 때문에 약속이라고 가정합니다.

이 작업을 수행하려고

var result = ""; 
var website = ["www.example1.com","www.example2.com"]; //(etc) 
var promises = []; 

website.forEach(url => { 
    promises.push(new Horseman() 
    .open(url) 
    .html()) 
} 

Promise.all(promises) 
.then(results => { 
    return results.forEach(html => { 
     result += html; 
    }) 
}) 
.then(()=> { 
    promises.forEach(horse => { 
    horse.log().close() 
    }) 
    console.log(result); 
}) 
+0

감사합니다! 이것은 내가 찾고 있었던 정확하게 것이었다!! – Tahum

+0

당신을 진심으로 환영합니다. 도와 드리겠습니다 :) –