2014-11-13 5 views
-1

URL을 가져 오려고 시도하면서 일련의 URL을 반복하지만 목록의 마지막 URL에서만 작동합니다. "NOT WRITING YET"console.log는 예상대로 urls 배열의 모든 항목을 실행하지만 이후 console.logs는 마지막 이벤트 만 실행합니다. 그들은 반환 "..... res.on ('오류'"모든 유효한 URL 및 있습니다 아무것도.Node.js 루프의 마지막 항목 만 가져 오는 루프

어떤 도움이 크게 감사합니다!

for (var z in urls) { 
    var getURL = urls[z]; 
    var copyURL = 'copies/'+getURL; 

    if (copyURL.indexOf('/') >= 0) { 
     var copyURLArr = copyURL.split('/'); 
    } else { 
     var copyURLArr = [copyURL]; 
    } 

    var copyFile = copyURLArr.pop(); 

    var runningDirs = ''; 
    for (var i in copyURLArr) { 
     if (runningDirs.length > 0) runningDirs += '/'; 
     runningDirs += copyURLArr[i]; 
     if (!require('fs').existsSync(runningDirs)) { 
      exec('mkdir '+runningDirs); 
     } 
    } 
console.log('NOT WRITING YET: '+urlPrefix+getURL); 
    require('http').get(urlPrefix+getURL, function(res) { 
console.log(urlPrefix+getURL); 
     res.on('data', function(data) { 
console.log(copyURL); 
      require('fs').createWriteStream(copyURL, {flags:'a+'}).write(data); 
     }); 
    }); 
} 

답변

2

값은 항상이 될 것입니다 라인 console.log(urlPrefix+getURL);에서 콜백이 변수의 값을 호출 할 때 때문에 마지막 url은 루프의 마지막 반복이다 그들이 할당있어 마지막에서 일 것이다.

대신

function doRequest(url, copyURL) { 
    require('http').get(url, function(res) { 
     console.log(url); 
     res.on('data', function(data) { 
      console.log(copyURL); 
      require('fs').createWriteStream(copyURL, {flags:'a+'}).write(data); 
     }); 
    }); 
} 
같은 별도의 함수에서 요청을

다음이 함수를 doRequest(urlPrefix+getURL, copyURL)으로 호출 한 다음 문제가 여전히 존재하는지 확인하십시오.

+0

고마워요! 그래, 어리석은 실수 였어.하지만 자바 스크립트로 그다지 많이하지 않았어. 그걸 잊어 버렸어. 그래도 내가하는 방식대로 작동하는 이유에 대해서는 아직 명확하지 않습니다. 나는 왜 내 console.log가 나오는지 이해하지만, http.get에 전달되는 매개 변수가 콜백의 일부가 아니며 그 반복에 존재하는 값을 전달해야하므로 좋지 않은가? –

+0

, 그러나 당신이 쓰는 copyURL은 올바른 것이 아닙니다 – nomier

+0

맞습니다. 그래, 오늘 완전히 피곤하지 않은 것은 상식이야 ... 미안해! 누군가 내가 잠 들어있을 때 코드를 작성하지 말라고 말해야합니다. –

관련 문제