2014-10-13 2 views
0

죄송합니다. 제 영어. 저는 초심자 JS 개발자입니다. 유성에 도움이 필요해. rss 어 그리 게이터를 작성하려고합니다. 이 코드가 저에게 맞지 않는 이유를 말씀해 주시겠습니까? rssContent는 항상 정의되지 않습니다. 하지만 HTTP.call에서 console.log (result.content)를 사용하면 rss 데이터가 표시됩니다. 나는 XML을 구문 분석에이 파일에 다른 함수에 rssContent를 전달해야합니다,하지만 난에 문제가 HTTP.callMeteor HTTP.call을 서버 측에서 사용하면?

server.js 코드 :

var rssSources = ['http://news.yandex.ru/auto.rss'], 
parsedRss = []; 

var rssContent; 

for (var i = 0; i < rssSources.length; i++) { 
    HTTP.call('GET', rssSources[i], 
     function(error, result) { 
      try { 
       rssContent = result.content; 
      } catch (e) { 
       console.log(e); 
      } 
     } 
    ); 
} 

console.log(rssContent); 
+0

당신은 콜백 메소드에 호출된다? –

+0

아니요. rss 소스에서 데이터를 가져와 구문 분석하고 서버 측에서 Mongo에 저장해야합니다. 아래 예제에서 내 server.js 콘텐츠. – dvplut

+0

데이터를 콜백 (비동기) 메소드 즉 비 블로킹 메소드에 할당한다는 의미입니다. –

답변

0

HTTP 요청에서 실행하는 두 가지 방법이 있습니다 유성. 기본적으로 동 기적으로 실행됩니다. 콜백을 전달하면 대신 비동기 적으로 실행됩니다. 이 경우 서버 측 코드라고 가정하면 콜백을 생략하고 동기식으로 처리하는 것이 더 쉽습니다 (훨씬 덜 골치 거리가되는 IMO).

var rssContent = []; 

for (var i = 0; i < rssSources.length; i++) { 
    var result = HTTP.call('GET', rssSources[i]); 
    // error handling 
    resultContent.push(result); 
} 

동기식 버전의 오류 처리에 익숙하지 않습니다. here for more details in their doc으로 연락하십시오.

+0

감사합니다. 나는 동기 방법에 대해 생각했다. 나는 특히 비동기 개발에 작은 경험을 가지고 있지만 RSS 소스의 큰 배열이 있다면? 동기화 요청을 사용하면 서버가 전체 배열을 처리 할 때까지 오랜 시간 바쁜 것일 수 있습니다. 아마 아직도 비동기 모드를 사용해야합니까? 아니면 내가 틀렸어? – dvplut

1

rssContent 변수는 콜백 (비동기) 비 블로킹 방법으로 호출하기 때문에 항상 정의되지 않습니다. 콜백 메소드 대신 sync (블로킹) 메소드를 사용해야한다. 전역 변수에 값을 할당하지 말고, http 요청에 대한 응답을받을 때마다 데이터베이스에 직접 데이터를 삽입하십시오.

차단 예 : -

var rssSources = ['http://news.yandex.ru/auto.rss'], 
parsedRss = []; 
var rssContent = ""; 
for (var i = 0; i < rssSources.length; i++) { 
    var result = Meteor.http.call("GET", rssSources[i]); 
    if(result.statusCode == '200' && result.content){ 
    rssContent += result.content; 
    } 
} 
console.log(rssContent); 

비 차단 예 : -

var rssSources = ['http://news.yandex.ru/auto.rss'], 

for (var i = 0; i < rssSources.length; i++) { 
    HTTP.call('GET', rssSources[i], 
     function(error, result) { 
      try { 
       //HERE INSERT YOUR DATA INTO THE DATABASE.INSTEAD OF ASSIGNING THE VALUE TO GLOBAL VARIABLE. 
      } catch (e) { 
       console.log(e); 
      } 
     } 
    ); 

가}

+0

나는 그 생각을 이해한다. 고맙습니다! – dvplut

관련 문제