2013-10-01 1 views
0

저는 표현형 프레임 워크에서 다소 새로운 것 같습니다. Flickr API를 호출하여 앨범 목록을 가져오고 각 앨범에 대해 미리보기 이미지를 가져와야합니다. 마지막으로 {title, thumb}과 같은 객체 목록을 사용하여 covers 배열을 작성해야합니다. 나는 완벽하게 만들어진 covers 배열을 템플릿에 전달하고 렌더링하고 싶습니다. node.js 콜백이 작동하는 방식으로 인해 문제가 발생했으며 루프의 경우 은 요청이 끝나기 전에 빨리 종료됩니다. 어떻게 제대로 할 수 있을까요? async하고 @sgwilly 말했다 request하지만, 뭔가를 잘못 사용하여비동기식 요청의 순서를 조합하여 최종 답을 만듭니다.

http.get(base_url+'&user_id='+flickr.user_id+'&method=flickr.photosets.getList', function(resp){ 
    var body = ''; 
    resp.on('data', function(chunk) { 
     body += chunk; 
    }); 
    resp.on('end', function() { 
     var json = JSON.parse(body); 
     var ps = json.photosets.photoset; 

     // final answer 
     var covers = {}; 

     for(var i=0; i<ps.length; i++) { 
      var p = ps[i]; 
      var getSizesUrl = base_url+'&user_id='+flickr.user_id+'&method=flickr.photos.getSizes&photo_id='+p.primary; 
      http.get(getSizesUrl, function(resp){ 
       var body1 = ''; 
       resp.on('data', function(chunk) { 
        body1 += chunk; 
       }); 
       resp.on('end', function() { 
        var json1 = JSON.parse(body1); 
        covers += {title: p.title._content, thumb: json1.sizes.size[1].source}; 

        if(i + 1 == ps.length) { 
         // last call 
         console.log(covers); 
         res.render('photosets', {covers: covers}); 
        } 
       }); 
      }); 
     } 
    }); 
}); 

업데이트 ...

request(base_url+'&user_id='+flickr.user_id+'&method=flickr.photosets.getList', function (error, response, body) { 
    var json = JSON.parse(body); 
    var ps = json.photosets.photoset; 

    // functions list to call by `async` 
    var funcs = {}; 

    for(var i = 0; i < ps.length; i++) { 
     var p = ps[i]; 
     funcs += function(callback) { 
      request(base_url+'&user_id='+flickr.user_id+'&method=flickr.photos.getSizes&photo_id='+p.primary, function (error, response, body1){ 
       var json1 = JSON.parse(body1); 
       var cover = {title: p.title._content, thumb: json1.sizes.size[1].source}; 
       callback(null, cover); 
      });   
     }; 
    } 

    // run requests and produce covers 
    async.series(funcs, 
     function(covers){ 
      console.log(covers); 
      res.render('photosets', {covers: covers});    
     } 
    ); 

}); 
+1

당신이 [요청]를 사용하여 시도 되세요 (https://npmjs.org/package/request)하고있어 [비동기] (https://npmjs.org/package/async) 모듈? 그들은 당신을 위해 무거운 짐을 질 수 있습니다. – warchimede

답변

1

Node.js를 콜백 조금 까다로운,하지만 그들은 잠시 후에 의미가 있습니다.

request을 외부 루프로 사용하고 내부에 콜백으로 async.concat을 사용하고 각 반복기를 URL 요청 요청으로 사용하려고합니다.

+0

대단히 감사합니다! 이것은 내가 찾고 있던 힌트였다. :) – marioosh

1

@ dankohn에 감사드립니다. 나는이 작업 :

request(base_url+'&user_id='+flickr.user_id+'&method=flickr.photosets.getList', function (error, response, body) { 
    var json = JSON.parse(body); 
    var ps = json.photosets.photoset; 

    async.concat(ps, function(p, callback){ 
     request(base_url+'&user_id='+flickr.user_id+'&method=flickr.photos.getSizes&photo_id='+p.primary, function (error, response, body1){ 
      var json1 = JSON.parse(body1); 
      var cover = {title: p.title._content, thumb: json1.sizes.size[1].source}; 
      callback(null, cover); 
     });   
    }, 
    function(err, covers){ 
     console.log(covers); 
     res.render('photosets', {covers: covers});   
    }); 
}); 
관련 문제