0

ライブラリを使用しており、次の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!")
});

コードはかなり読みやすいですが、ロジックは次のとおりです。

  1. インシデントIDが有効であることを確認してください
  2. 画像テーブルを取得する
  3. イメージを S3 にアップロードする

この 3 つが同時に発生する可能性があります。ステップ1と2はどちらも同じ「database.then」を共有しているので、それを使いたいのですが、プロミスをフラット化する方法がわかりません。

何か問題がある場合 (incidentId が無効であることを含む)、私は電話する必要がありますelib.deleteFromS3('image_uploads/' + id);

それがすべて成功した場合は、データベースに新しいエントリを追加して「コミット」する準備ができています。 images.insert({ _id: id, size: pic.size })

それが機能する場合は、完了です。そうでない場合は、S3 から再度削除する必要があります。

エラー処理と「database.then」の再利用を満たしながら、これを読みやすく保つための助けをいただければ幸いです。

4

1 に答える 1