2016-09-06 8 views
1

問題:ノード4.3とグラフィックスマジックを使って、アップロードされたS3ピクチャのサイズを変更するAWSラムダ関数を作成します。アレイで約束をつなぐ方法

問題:プロミスフローにピクチャオブジェクトの配列を統合する方法を理解できません。私が見つけることができるすべてのスタックの例は、すべてのデータがわかっているときに約束されたオブジェクトの配列を示しています。しかし、まず画像データを読み込んでから、サイズ変更関数に渡す必要があります。

以下の関数は、resizePictureが解決する前に完了します。私は問題が返ってこないことを知っている約束と正しい順序で解決する。私は困惑している。

var pictureSizes = [ 
    {width: 100, size: 'thumbnail', suffix: '_t'}, 
    {width: 300, size: 'small', suffix: '_s'}, 
    {width: 600, size: 'medium', suffix: '_m'}, 
    {width: 1000, size: 'large', suffix: '_l'} 
]; 

exports.handler = function(event, context) { 

    var srcBucket = event.Records[0].s3.bucket.name;. 
    var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); 
    var dstBucket = srcBucket + "pictures"; 
    var typeMatch = srcKey.match(/\.([^.]*)$/); 
    var fileName = path.basename(srcKey); 

    downloadImage({ Bucket: srcBucket, Key: srcKey}) 
    .then(result => pictureSizes.map(picture => resizePicture(result, picture))) 
    .then(result => saveImage(result, dstBucket, fileName)) 
    .catch(err => console.log('error', err)) 
} 

function downloadImage(params) { 
    console.log('download Image', params); 
    return new Promise(function(resolve, reject) { 
    s3.getObject(params, function(err, data) { 
     if (err) { 
     reject(err); 
     } 
     resolve(data); 
    }) 
    }); 
} 

function resizePicture(result, picture) { 
    return new Promise(function(resolve, reject) { 
    const extension = result.ContentType.split('/')[1]; 
    gm(result.Body) 
     .resize(picture.width) 
     .toBuffer(extension, function(err, buffer) { 
     if (err) { 
      reject(err); 
     } else { 
      resolve({ 
      key: `${picture.suffix}.${extension}`, 
      binary: buffer, 
      ContentType: result.contentType 
      }) 
     } 
     }); 
    }) 
} 

function saveImage(result, dstBucket, fileName) { 
    return new Promise(function(resolve, reject) { 
    s3.putObject({ 
     Bucket: dstBucket, 
     Key: `${fileName}${result.key}`, 
     Body: result.binary, 
     ContentType: result.ContentType 
    }, function(err, data) { 
     if (err) { 
     reject(err); 
     } 
     resolve(data); 
    }) 
    }) 
} 

答えて

1

ああ、あなたはほとんどそれを持っている!ここで生成する約束の配列のウォッチャーを作成する必要があります:pictureSizes.map(picture => resizePicture(result, picture))

Bluebird's Promise.map試してみてください、そして、あなたのラインを読むことができます:

.then(result => Promise.map(pictureSizes, picture => resizePicture(result, picture))) 

をそして、あなたは任意のネストされた関数を持たないようにしたい場合は、#bindは、あなたが望むものである:それだった

.then(result => Promise.map(pictureSizes, resizePicture.bind(null, result))) 
+0

は、ありがとうございました!ネストされた呼び出しなしでそれを作る方法を知っているなら、私は興味を持っています...より機能的なプログラマーになろうとしています。 –

関連する問題