/ /複数の作成+更新を正しく実行するように - promise、sequelize.js

成功した複数の複製を正しく実行するようにする - promise、sequelize.js

私はアイテムのリストを掻き集めるクローンジョブを持っています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)
}

そのマイナーな改善以外にも、約束を正しく連鎖させ、正しい掛け合いをしているようです。