2016-04-29 9 views
0

私はこのコードを動作させることができません、私は自分のDBから5ランダンスのアイテムを生成し、それらを配列(dato)に格納しようとしていますが、Array.PushはNodeJSで動作しません

/* GET users listing. */ 
router.get('/', function (request, response) { 
    var dato = new Array(); 

    for(var i=0;i<7;i++){ 
     almuerzoSchema.findRandom({}, {}, {limit: 5}, function(err, results) { 
      if (!err) { 
       results.forEach(function (record) { 
        dato.push(record.nombre); 
       }); 
      } 
     }); 
    } 
    console.log(dato); 
    response.render('almuerzo.jade',{almuerzovar: dato}); 
}); 

はconsole.log(ダトが)を示し空である:レーヨンコード、言ったように

[] 

私はそれをCONSOLE.LOGの "record.nombre" を印刷する場合は、正しく

+4

'almuerzoSchema.findRandom'は私に' async'ようです! forループが終了する前に – Rayon

+0

を実行すると、datoを印刷しようとしています。 Forループは非同期で実行されます。 – Subburaj

+1

さらにコードを書く前に、非同期プログラミングNode.jsがどのように動作するかを学んでください。このルートにはいくつかの問題があります(例:あなたのforループは同期的で、かなりの問題を引き起こします。 – Qix

答えて

2

を示し非同期なので、これを次のように変更します(同期、私は)Promiseを使用しています:

/* GET users listing. */ 
router.get('/', function (request, response) { 
    var dato = new Array(), promises =[]; 

    for(var i=0;i<7;i++){ 
     promises.push(promisifiedFindRandom()) 
    } 

    Promise.all(promises).then(function(){ 
     console.log(dato); 
     response.render('almuerzo.jade',{almuerzovar: dato}); 
    }) 

    function promisifiedFindRandom(){ 
     return new Promise(function(resolve, reject){ 
      almuerzoSchema.findRandom({}, {}, {limit: 5}, function(err, results) { 
       if (!err) { 
        results.forEach(function (record) { 
         dato.push(record.nombre); 
        }); 
        resolve(); 
       }else{ 
       resolve(); 
       } 
      });    
     }) 
    } 
}); 

編集:ノードV4 +サポートの約束ネイティブに、古いバージョンのために、あなたはポリフィル/シムを使用することができます

+0

'almuerzoSchema.findRandom'は' loop'バディにあります! – Rayon

+0

@Rayon私の悪い、更新された:) – mido

+0

私はあなたが 'else {reject(err); } ' – saadq

関連する問題