ライブラリを使用しており、次のwhen
ようなコードがあります。
when.join(
database.then(function(db) {
return db.collection("incidents");
}).then(function(col) {
return col.idExists(incidentId);
}),
database.then(function(db) {
return db.collection("images");
}),
elib.uploadToS3(pic.path, 'image_uploads/' + id, pic.type)
).spread(function(exists, images, url) {
if(!exists) {
throw new Error("Incident id does not exist");
}
console.log("Image sucessfully uploaded to: ", url);
return images.insert({
_id: id,
size: pic.size
});
}).then(function() {
console.log("At this point, it's totally succesfully recorded in the database!")
});
コードはかなり読みやすいですが、ロジックは次のとおりです。
- インシデントIDが有効であることを確認してください
- 画像テーブルを取得する
- イメージを S3 にアップロードする
この 3 つが同時に発生する可能性があります。ステップ1と2はどちらも同じ「database.then」を共有しているので、それを使いたいのですが、プロミスをフラット化する方法がわかりません。
何か問題がある場合 (incidentId が無効であることを含む)、私は電話する必要がありますelib.deleteFromS3('image_uploads/' + id);
それがすべて成功した場合は、データベースに新しいエントリを追加して「コミット」する準備ができています。
images.insert({ _id: id, size: pic.size })
それが機能する場合は、完了です。そうでない場合は、S3 から再度削除する必要があります。
エラー処理と「database.then」の再利用を満たしながら、これを読みやすく保つための助けをいただければ幸いです。