2016-08-24 3 views
0

이 간단한 코드로 중첩 약속을 이해하려고 노력했습니다.Node.js 비동기 내에서 forEach 루프 내 다른 문 다음 문

내가 말하는 모든 함수는 비동기식이며, 하나는 전체 컬렉션을 제공하고 다른 하나는 요소의 각각의 개별 정보를 제공합니다.

내가 뭘 잘못하고 있니?

const PirateBay = require ('thepiratebay'); 
var os = require ('os'); 
var sys = require('util'); 
var util = require('util'); 
var cfg = require('./config/appconf.js'); 
var mysql = require('mysql'); 
var Torrent = require('./models/torrent.js'); 
var parseTorrent = require('parse-torrent') 

var async = require('async'); 
function saveResults (results) { 
    console.log("Save Results"); 
    var cTorrents = []; 
    for (var key in results) { 
     var t =results[key]; 
     var torrent = new Torrent() 
     torrent.id = t.id; 
     torrent.name = t.name; 
     torrent.size = t.size; 
     torrent.seeders = t.seeders; 
     torrent.leechers = t.leechers; 
     torrent.verified = t.verified; 
     torrent.uploader = t.uploader; 
     torrent.category = t.category.name; 
     torrent.description = t.description; 
     torrent.subcategory = t.subcategory.name; 
     var r = parseTorrent (t.magnetLink); 
     torrent.announce = r.announce; 
     torrent.hash = r.infoHash; 
     cTorrents.push (torrent); 
    } 
    return cTorrents; 
} 
PirateBay 
    .recentTorrents() 
    .then(function(results){ 
     var lTorrents = saveResults(results); 

     async.each (lTorrents,function (t,next){ 
       await PirateBay 
        .getTorrent(t.id) 
        .then(function (err, doc){ 
         console.log(doc.description); 
         t.doc = doc.description; 
         next(); 
        }); 
     },function (err) { 
      console.log ("WHNEEEEE"); 
      console.log(lTorrents); 
     }); 
     console.log(lTorrents); 
    }) 
    .catch (function (err){ 
     console.log(err); 
    }); 
+1

왜 뭔가 잘못되었다고 생각하십니까? 문제가 있습니까? 그것은 무엇이며 대신 일어날 것으로 예상되는 것은 무엇입니까? –

답변

0

비동기 모듈은 필요하지 않습니다. Promise으로 충분해야합니다. 특히 당신이 관심을 가질만한 것은 Promise.all()입니다. 모든 약속이 끝나면 약속을 지키고 해결합니다. Array.prototype.map()을 사용하면 lTorrents의 각 요소를 Promise에 매핑 할 수 있습니다. 여기에 예제가 있습니다.

PirateBay 
     .recentTorrents() 
     .then(function(results){ 
      var lTorrents = saveResults(results); 
      return Promise.all(lTorrents.map(function(t) { 
       return PirateBay.getTorrent(t.id) 
        .then(function(doc) { 
         t.doc = doc.description; 
         return t; 
        }) 
        .catch(function(err) { 
         // if one request fails, the whole Promise.all() rejects, 
         // so we can catch ones that fail and do something instead... 
         t.doc = "Unavailable (because getTorrent failed)"; 
         return t; 
        }); 
      })); 
     }) 
     .then(function(lTorrents) { 
      // do what you gota do.. 
     })