私はアイテムのリストを掻き集めるクローンジョブを持っていますWebサイトを開き、レコードをデータベースに挿入または更新します。私がページを掻き集めるとき、私はまだ作成されていない新しいもののためのレコードを作成したい、そうでなければ既存のものを更新する。
// pretend there is a "Widget" model defined
function createOrUpdateWidget(widgetConfig) {
return Widget.find(widgetConfig.id)
.then(function(widget) {
if (widget === null) {
return Widget.create(widgetConfig);
}
else {
widget.updateAttributes(widgetConfig);
}
});
}
function createOrUpdateWidgets(widgetConfigObjects) {
var promises = [];
widgetConfigObjects.forEach(function(widgetConfig) {
promises.push(createOrUpdateWidget(widgetConfig));
});
return Sequelize.Promise.all(promises);
}
createOrUpdateWidgets([...])
.done(function() {
console.log("Done!");
});
これはうまくいくようですが、もし私が "mこれを「正しく」行うかどうかを決定します。 DBのやりとりを実行するすべての約束事は、連続して実行する必要がありますか?このようなことをする良い方法はありますか?
回答:
回答№1は6あなたがやっていることはかなり熟練していて、完璧です。改良のための唯一の部屋は、Sequelizeが約束のためにBluebirdを使用するという事実を利用することです .map
無料で、あなたは以下のように変換できます:
function createOrUpdateWidgets(widgetConfigObjects) {
var promises = [];
widgetConfigObjects.forEach(function(widgetConfig) {
promises.push(createOrUpdateWidget(widgetConfig));
});
return Sequelize.Promise.all(promises);
}
に:
function createOrUpdateWidgets(widgetConfigObjects) {
return Sequelize.Promise.map(widgetConfig, createOrUpdateWidget)
}
そのマイナーな改善以外にも、約束を正しく連鎖させ、正しい掛け合いをしているようです。