2016-11-30 6 views
1

ファイルをGoogleクラウドにアップロードしてからパブリックURLを取得するには、次のコードを使用しました。しかし、約束事をつなぎ合わせると、すぐに乱雑になります。ES6クラスを使用しているときの約束

私の例では、約束事をより明確な方法で連鎖させる具体的な例を手伝ってもらえますか?

let routes = function(imageUploader) { 
    router.post('/upload', 
     imageUploader.getMulter().single('image'), 
     (req, res) => { 
      imageUploader.uploadFilePromise(req.file.path) 
       .then((filename, error) => { 
        if(error) throw new Error(error); 
        imageUploader.getExternalUrl(filename) 
         .then((publicUrl, error) => { 
          if(error) throw new Error(error); 
          console.log(publicUrl); 
         }) 

       }) 
    }); 

    return router; 
}; 

私のImageUploaderクラスはFYI同様にここに含まれています。他のベストプラクティスの提案も大歓迎です。

const Multer = require('multer'), gcloudStorage = require('./vendors/gcloud'); 

class ImageUploader { 

    constructor() { 
     this.bucket = gcloudStorage; 
    } 

    uploadFile(req, res, next) { 
     if(!req.file) { 
      next(); 
     } 

     this.bucket.upload(req.file.path, (err, file) => { 
      if(err) throw new Error(err); 
      req.file.publicUrl = this.getExternalUrl(req.file.name) 
     }) 
    } 

    uploadFilePromise(path) { 
     return new Promise((resolve, reject) => { 
      this.bucket.upload(path, (err, file) => { 
       if(err) reject(err); 
       resolve(file.name); 
      }) 
     }) 
    } 

    getExternalUrl(filename) { 
     return new Promise((resolve, reject) => { 
      this.bucket.file(filename).getSignedUrl({ 
       action: 'read', 
       expires: '03-17-2025' 
      }, (err, url) => { 
       if (err) reject(err); 
       resolve(url); 
      }); 
     }); 
    } 

    storage() { 
     return Multer.diskStorage({ 
      destination: function (req, file, cb) { 
       cb(null, 'uploads/') 
      }, 
      filename: function (req, file, cb) { 
       cb(null, Date.now() + file.originalname) 
      } 
     }); 
    } 

    getMulter() { 
     return require('multer')({ storage: this.storage() }); 
    } 
} 

module.exports = ImageUploader; 
+0

わからない本当にES6固有のこの問題については何ですか?はい、あなたは 'class'定義を表示していますが、私はES6構文で宣言されたオブジェクトやオブジェクトを作成する古いES5の方法とは異なる疑問があります。 – jfriend00

答えて

4

then()に渡されるコールバックは、1つだけの引数を受け取り、2つではありません。

さらに、連鎖を可能にするために値や別の約束を返すことができます(必要があります)。

コールバックのいずれかがスロー、または拒否約束を返した場合、あなたは鎖の末端にキャッチしてエラーを処理することができます

imageUploader.uploadFilePromise(req.file.path) 
    .then(filename => imageUploader.getExternalUrl(filename)) 
    .then(publicUrl => console.log(publicUrl)) 
    .catch(error -> console.log(error)); 
0

単に連鎖約束については、私はインデントを追加しないほうがクリーンです。

ex。

promise 
.then(do something) 
.then(do something else); 
関連する問題