2017-11-17 4 views
-2

私は次のコードを書いています。入力(結果)は、S3バケット上に存在するファイル名の配列です。私が望むことは、そのリストをループし、それぞれの署名付きURLを取得することです。async/s3の署名付きURLを取得する配列をループするのを待つ

let result = [{ fileName: "dog.jpg" },{ fileName: "cat.jpg"}]; 
 

 
async function getSignedUrl(key){ 
 
    let params = { Bucket: bucketName, Key: key }; 
 
    let url = await s3.getSignedUrl('getObject', params, (err, url) => { 
 
     if (err) reject(err) 
 
     return url; 
 
    }); 
 
} 
 

 
async function process(items) { 
 
    for (let item of items) { 
 
    const signedUrl = await getSignedUrl(item.fileName); 
 
    item.url = signedUrl; 
 
    } 
 
    return items; 
 
} 
 

 

 
process(result).then(res => { 
 
    console.log(res); 
 
});

問題は、私は結果をにconsole.logとき、新しいURLが存在しないからです。私は問題が何であるか把握できません。私はそれが非同期の問題だと思っていますが、私はそれを理解するのに十分な経験はありません。

+3

コールバックをとる関数ではなく、約束を返す関数でのみ 'await'を使用してください。 – jfriend00

答えて

1
let result = [{ fileName: "dog.jpg" },{ fileName: "cat.jpg"}]; 

async function getSignedUrl(key){ 
    return new Promise((resolve,reject) => { 
     let params = { Bucket: bucketName, Key: key }; 
     s3.getSignedUrl('getObject', params, (err, url) => { 
     if (err) reject(err) 
     resolve(url); 
     }) 
}); 
} 

async function process(items) { 
    for (let item of items) { 
    const signedUrl = await getSignedUrl(item.fileName); 
    item.url = signedUrl; 
    } 
    return items; 
} 


process(result).then(res => { 
    console.log(res); 
}); 

注:それはあなたがawait以来の可能約束の配列を処理している場合Promise.all()を使用することをお勧めします非同期機能でそのコードの実行を停止それはだていても(ないイベントループ)ブロッカー機能はありません。このシナリオでは、並列リクエストを行う方がはるかに高速です

+0

ありがとうございます。それは私をたくさん助けました。 私はlet 'url = s3.getSignedUrlが動作するように' await 'を削除しなければなりませんでした。 私はPromise.all()でそれを実装しようとします。 –

+0

ああええ..私は待っていることを忘れて..それを指摘してくれてありがとう。 –

関連する問題