我用express做了restful api接口,前端用angular1.5 $http呼叫接口,之前我都只更新一筆資料,沒有太大問題,代碼如下:
express api部分
router.put('/animals', (req, res, next) => {
let animal = req.body;
db.Animal.findOne({
where: {
idNo: animal.idNo
}
}).then(function (data) {
data.updateAttributes(animal).then(function (animal) {
res.json(animal);
});
});
});
Angular部分
$http({
method : 'PUT' ,
url : '/api/animals' ,
data : animal,
headers : { 'Content-Type' : 'application/json' }
})
.success(function(animal){
alert('更新成功');
});
但是我現在想更新多筆資料,一個array內的多個animal,目前有兩個思路:
api接口不更改,在angular那寫個for迴圈,多次呼叫同個接口,但這樣似乎要寫個閉包才能確定是不是全部的update 完成了
更改api部分,angular一次把整個array傳進去,再利用sequelize的某些功能做一次更新,這部分目前只看到兩種做法,
1.利用promise.all 進行全部更新
2.一樣的寫法 只是把for迴圈放到api那
3.或許更高級一點可以利用transaction的功能,如果有一筆更新失敗就rollback??這我從來沒用過不清楚
請問哪樣做法比較好,具體又要怎麼實現呢? 謝謝
目前是使用Angular1.5提供的$q,可以一次發一個array的$http要求(promise),再用$q.all取得結果,具體代碼如下:
var qPromiseArr = [];
for(var i=0;i<switchingCageAnimals.length;i++){
qPromiseArr.push( $http({
method : 'PUT' ,
url : '/api/animals' ,
data : switchingCageAnimals[i],
headers : { 'Content-Type' : 'application/json' }
}));
}
$q.all(qPromiseArr).then(function(dataList){
//dataList是一個Object Array 可以取得每次http返回的結果
});