2017-07-31 64 views
0

我正試圖找到最簡單的方法來實現等待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 
    }); 
    }); 
}); 

我的童話在異步/等待新的,所以我在努力尋找一種方法來實現它進入這個快速通道(假設這是我唯一的選擇) - 因爲看起來你不能只是做一個循環,因爲它不是一個承諾。 /* RETURN updated changes array here? */是我要返回更改的地方,但是如果我在那裏返回更改,它顯然會返回未更新的更改,因爲它沒有等待for循環。

此路線取得當天價格變化的行數,然後獲取前一行的價格差異並將它們添加到數組中。之後它應該將修改後的數組推到最後。然後從那裏進入我的模板。

我在這裏看到很多選擇,但它開始變得混亂。所以我想從這裏得到一些建議。

回答

1

爲您的代碼添加異步/等待對。看看這是否適合你。

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 }) 
    }) 
})