2017-11-17 1 views
-2

Ich habe den folgenden Code geschrieben. Die Eingabe (Ergebnis) ist ein Array von Dateinamen, die in einem S3-Bucket vorhanden sind. Was ich hoffe, ist, diese Liste durchzulaufen und eine signierte URL für jeden zu erhalten.async/erwarten Schleife durch Array von s3 signierte 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); 
 
});

Das Problem ist, wenn ich das Ergebnis console.log, die neue URL nicht vorhanden ist. Ich kann nicht herausfinden, was das Problem ist. Ich vermute, es ist ein asynchrones Problem, aber ich bin nicht erfahren genug, um es herauszufinden.

+3

Sie verwenden nur 'erwarten' mit einer Funktion, die ein Versprechen zurückgibt, nicht eine Funktion, die einen Rückruf nimmt. – jfriend00

Antwort

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); 
}); 

HINWEIS: es ist besser Promise.all() zu verwenden, wenn Sie eine Reihe von möglichen Versprechungen seit await verarbeiten stoppt die Ausführung des Codes in Asynchron-Funktion(nicht die Ereignisschleife) obwohl es ein ist keine Blockierfunktion. Parallele Anfrage ist viel schneller in diesem Szenario

+0

Vielen Dank für Ihre Antwort. Es hat mir sehr geholfen. Ich musste nur die 'erwarten' in Let URL = warten s3.getSignedUrl, um es funktioniert zu entfernen. Ich werde versuchen, es später mit Promise.all() zu implementieren. –

+0

oh yeah .. Ich habe vergessen, die warten zu entfernen .. danke für das Zeigen. –

Verwandte Themen