Cố gắng tránh lồng nhau then
, và giữ cho chuỗi lời hứa phẳng lặng. Hơn nữa, bạn có thể nối hai trường hợp mô hình thành một đoạn mã (DRY). Cuối cùng, sử dụng map
thay vì forEach
vì vậy bạn trả về một mảng các lời hứa, sau đó bạn có thể cấp dữ liệu cho Promise.all
:
router.post('/devices', function (req, res, next) {
var promises = loadash.map(req.body.devices, function (device) {
return Device.forge()
.where({deviceid: device.deviceid})
.fetch({columns: ['id', 'mode']})
.then(function (fetchedDevice) {
var model = [Model_1, Model_2][fetchedDevice.get('mode')-1];
if (model) {
return model.forge()
.where({device_id: fetchedDevice.get('id')})
.orderBy('epoch_time', 'DESC')
.fetch();
}
}).catch(function (err) {
console.log(err);
});
});
Promise.all(promises).then(function (currentData) {
currentData = currentData.filter(model => model) // exclude undefined
.map(model => model.toJSON());
console.log('Final: ' +currentData);
});
}