2016-09-06 5 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

가, 감사합니다! 만약 당신이 중첩 된 호출없이 그것을 만드는 방법을 안다면, 나는 더 좋은 기능적 프로그래머가 되려고 노력하고 싶다. –

관련 문제