2017-07-31 11 views
0

Nodeでforループが終了するのを待つ方法を実装する最も簡単な方法を見つけようとしています。私のセットアップはNodeJS + ExpressJS + SequelizeJSです。NodeJS:forループを待つ最も簡単な方法

次の例では、ルートを使用している:

router.get('/today', function(req, res, next){ 

    /* Get all created rows today */ 
    models.prices.findAll({ 
    order: [['createdAt', 'DESC']], 
    limit: 10, 
    where: Sequelize.where(
     Sequelize.fn('DATE', Sequelize.col('createdAt')), 
     Sequelize.literal('CURRENT_DATE') 
    ) 
    }).then(function(changes){ 


    /* Get price difference per sourceId & productId */ 
    for (let i = 0; i < changes.length; i++) { 
     models.prices.findOne({ 
     where: { 
      productId: changes[i].productId, 
      sourceId: changes[i].sourceId 
     }, 
     order: [['createdAt', 'DESC']], 
     limit: 1, 
     offset: 1 
     }).then(function(difference){ 
     /* Add price difference to array */ 
     changes[i]['difference'] = (changes[i].price - difference.price).toFixed(2); 
     }); 
    } 


    /* RETURN updated changes array here? */ 

    }).then(function(changes){ 
    res.render('today', { 
     changes: changes 
    }); 
    }); 
}); 

私は非同期/待つの妖精新しいですので、私は、このExpressのルートにそれを実装する方法を見つけるのに苦労しています(それが私の唯一の選択肢だと仮定した場合) - なぜなら、それは約束ではないので、あなたはループでそれをやることができないように思えるからです。 /* RETURN updated changes array here? */は私が変更を返す場所ですが、変更をそこに戻すと、forループを待たずに変更されていない変更が明らかに返されます。

このルートは、その日の価格変更の行を受け取り、前の行と価格の差を求めて配列に追加します。その後、変更された配列を最後の.thenにプッシュし、そこからテンプレートに移動します。

ここでは多くのオプションがありますが、それは乱雑になり始めました。だから私はここからいくつかの提案をしたかった。

答えて

1

コードにasync/awaitペアを追加します。それがあなたのために働くかどうか見てください。

router.get('/today', async function(req, res, next) { 

    let changes = models.prices.findAll({ 
     order: [['createdAt', 'DESC']], 
     limit: 10, 
     where: Sequelize.where(
      Sequelize.fn('DATE', Sequelize.col('createdAt')), 
      Sequelize.literal('CURRENT_DATE') 
     ) 
    }); 

    /* Get price difference per sourceId & productId */ 
    for (let i = 0; i < changes.length; i++) { 
     let difference = await models.prices.findOne({ 
      where: { 
       productId: changes[i].productId, 
       sourceId: changes[i].sourceId 
      }, 
      order: [['createdAt', 'DESC']], 
      limit: 1, 
      offset: 1 
     }); 
     /* Add price difference to array */ 
     changes[i]['difference'] = (changes[i].price - difference.price).toFixed(2); 
    } 

    /* RETURN updated changes array here? */ 
    res.render('today', { 
     changes: changes 
    }); 

}); 
+0

の配列で、このマッピングの変更の配列を解決しようとすることができ、これは私に多くの時間を節約できます。私は、経路の初期機能に非同期機能を追加するとは考えていませんでした。完璧! –

+0

あなたは歓迎です)=うれしいことに助けられました。 – Val

0

あなたが約束

後半の応答のため申し訳ありません
router.get('/today', function (req, res, next) { 
    /* Get all created rows today */ 
    models.prices.findAll({ 
    order: [['createdAt', 'DESC']], 
    limit: 10, 
    where: Sequelize.where(
     Sequelize.fn('DATE', Sequelize.col('createdAt')), 
     Sequelize.literal('CURRENT_DATE') 
    ) 
    }) 
    .then(function(changes) { 
    let getPriceDifferencePromises = changes.map(function (change) { 
     return new Promise(function (resolve, reject) { 
     return models.prices.findOne({ 
      where: { 
       productId: change.productId, 
       sourceId: change.sourceId 
      }, 
      order: [['createdAt', 'DESC']], 
      limit: 1, 
      offset: 1 
     }) 
     .then(function (difference) { 
      change.difference = (change.price - difference.price).toFixed(2) 
      return change 
     }) 
     }) 
    }) 

    // Start parallele promises 
    return Promise.all(getPriceDifferencePromises) 
    }) 
    .then(function (changes) { 
    res.render('today', { changes: changes }) 
    }) 
}) 
関連する問題