2013-04-24 3 views
1

원격 파일 배열의 배열이 있습니다. 나는 단순히 foreach 배열을 사용하고 foreach의 본문에서 데이터 다운로드를위한 HTTP GET 요청을 시작한다. 하지만 모든 것이 비동기이며 요청 콜백에 파일을 저장하려면 파일 이름을 알아야합니다.콜백에서 배열 및 배열 멤버 사용

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

데모 코드 :

files = ["url.com/file.png", "url.com/file.doc"] 

for file in files 
    req = http.get file, (response) => 
    response.setEncoding 'binary' 
    body = "" 

    response.on "data", (chunk) => 
     body += chunk 

    response.on "end",() => 
     #Here I needs to know the file name to save it 
     fs.writeFileSync @currentFolder + "/Files/" + file, body, "binary" 

감사합니다!

+0

무엇이 문제입니까? 'url.com/file.png'을'file.png'로 변환하는 방법을 묻고 있습니까? – Eric

+0

아니요, writeFileSync에 맞춰 원래 변수 "file"의 값을 가져와야합니다. 하지만 모든 것이 비동기이므로 변수 "파일"은 마지막 파일 이름으로 만 채워집니다. –

+0

정말입니까? 나는 루프를위한 coffeescript가 이런 종류의 문제를 막기 위해 클로저를 사용한다고 생각했다. – Eric

답변

0

범위를 지정해야합니다. 이 같은 기능을 사용

files = ["url.com/file.png", "url.com/file.doc"] 

for file in files 
    ((file) -> 
     req = http.get file, (response) => 
      response.setEncoding 'binary' 
      body = "" 

     response.on "data", (chunk) => 
      body += chunk 

     response.on "end",() => 
      fs.writeFileSync @currentFolder + "/Files/" + file, body, "binary" 
    ).call @, file 
+2

'do'를 쓰지 않는 이유는 무엇입니까? 이 섹션 하단의 http://coffeescript.org/#loops를 참조하십시오. –

0

커피 스크립트에서이 작업을 수행 할 수있는 적절한 방법은 do 호출입니다. 또한 인코딩을 'binary'으로 설정하는 것은 의미가 없으며 단지 버퍼와 문자열에서 데이터를 앞뒤로 변환하는 추가 작업을 만듭니다.

for file in files 
    do (file) => 
    req = http.get file, (response) => 
     parts = [] 

     response.on "data", (chunk) => 
     parts.push chunk 

     response.on "end",() => 
     body = Buffer.concat parts 
     fs.writeFileSync @currentFolder + "/Files/" + file, body