2013-06-23 4 views
1

이 코드는 Node.js crawler에서 실행되며 모든 데이터를 가져 오는 단순화 된 코드입니다. 하지만이 내부에 삽입 어떻게 "콜백"datas [I] .name을을 : 기능 값 VAR의 "I" I = 0 ... 내가 이름을 추가 해요 때 (VAR에 대한주기에서 오류를 반환 :함수는 세 개의 인수 만 표시합니다.

형식 오류 :. 정의되지 않은

var Crawler = require("crawler").Crawler; 
var crawler = new Crawler; 

var datas = [ 
{name: 'John', url: 'john025'}, 
{name: 'Jim', url: 'jim04567'} 
]; 

function crauler(done) { 
for (var i = 0; i < datas.length; i++) { 
    var link = 'http://somesite.com/' + datas[i].url; 
    crawler.queue([{ 
     "uri": link, 
      // inside this func 
         "callback": function (error, result, $, datas, i) { 
      var arr = $('.blogpost').map(function (index) { 
       var str = $(this).attr('href'); 
       var object = { 
        numb: str, 
        name: datas[i].name 
       }; 
       return obj; 
      }).get().join(','); 
      done(arr); 
} }]) }; }; 

crauler (function (arr) { 
console.log(arr); 
}); 
+0

선언'i'가 외부 루프 :

그래서, 콜백 함수의 정의는 다음과 같습니다 뭔가해야합니다. –

+0

@bfavaretto 그렇지 않습니다. 변수를 루프하는 것이 TypeError의 주된 문제는 아닙니다. 자세한 내용은 내 대답을 참조하십시오. –

+0

@jaux이 오류는 [악명 높은 루프 문제] (http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem)를 해결하려는 시도로 인해 발생하므로 속임수 링크가 의미가 있습니다. 좋은 답변입니다. – bfavaretto

답변

4

이 같은 콜백 함수에 datasi를 전달할 수 없습니다. 콜백 함수가 호출되는 인수는 호출자에게 달려 있으며, 호출자는이를 제어 할 수 없습니다.

당신은 "형식 오류 : 부동산의 정의의 '정의되지 않은'읽을 수 없습니다"보고있는 당신이 당신의 콜백 함수를 매개 변수로 datasi을 갖고 싶어때문에이; 호출자는 의 첫 번째 3 개의 인수 인 [crawler callback reference]로 콜백을 호출하므로 datasiundefined입니다.

따라서 라인에서 datasi을 제거해야합니다 : datas가 콜백 함수의 외부 범위에 정의되어

"callback": function (error, result, $, datas, i) { 

때문에, 콜백은 특별한 치료없이 datas에 액세스 할 수 있습니다. 변수 i의 경우 다른 답변에서 언급했듯이 조금 까다 롭습니다. 따라서 클로저를 만들어야합니다.

"callback": (function(i) { // create closure for i 
    return function (error, result, $) { // no more datas and i here 
     var arr = $('.blogpost').map(function (index) { 
      var str = $(this).attr('href'); 
      var object = { 
       numb: str, 
       name: datas[i].name // access datas as it 
      }; 
      return obj; 
     }).get().join(','); 
     done(arr); 
    } 
})(i) 
+0

감사합니다. 그 모든 뉘앙스와 뉘앙스. 그리고 그 뒤에 몇 가지 인수를 사용하여 함수가()에 배치 될 때이 구문 스타일에 대한 링크를 제공 할 수 있습니까? 나는 처음으로 그것을 본다. – khex

+0

@Ligamentum 함수 식입니다. http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip –

2

값을 캡처하려면 클로저가 필요합니다. 문제를 해결하는 방법 중 하나입니다. closures에서 읽으십시오.

자바 스크립트

var Crawler = require("crawler").Crawler; 
var crawler = new Crawler; 

var datas = [{ 
    name: 'John', 
    url: 'john025' 
}, { 
    name: 'Jim', 
    url: 'jim04567' 
}]; 

function queue(link, i) { 
     crawler.queue([{ 
      "uri": link, 
      // inside this func 
      "callback": function (error, result, $, datas, i) { 
       var arr = $('.blogpost').map(function (index) { 
        var str = $(this).attr('href'); 
        var object = { 
         numb: str, 
         name: datas[i].name 
        }; 
        return obj; 
       }).get().join(','); 
       done(arr); 
      } 
     }]); 
} 

function crauler(done) { 
    for (var i = 0; i < datas.length; i++) { 
     var link = 'http://somesite.com/' + datas[i].url; 
     queue(link, i); 
}; 

crauler(function (arr) { 
    console.log(arr); 
}); 
관련 문제