Javascript 异步/等待通过数组循环以获取s3签名URL';s
我已经编写了以下代码。输入(结果)是S3存储桶上存在的文件名数组。我希望做的是循环遍历该列表,并为每个列表检索一个签名的URLJavascript 异步/等待通过数组循环以获取s3签名URL';s,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我已经编写了以下代码。输入(结果)是S3存储桶上存在的文件名数组。我希望做的是循环遍历该列表,并为每个列表检索一个签名的URL let result=[{fileName:“dog.jpg”},{fileName:“cat.jpg”}]; 异步函数getSignedUrl(键){ 设params={Bucket:bucketName,Key:Key}; 让url=wait s3.getSignedUrl('getObject',params,(err,url)=>{ 如果(错误)拒绝(错误)
let result=[{fileName:“dog.jpg”},{fileName:“cat.jpg”}];
异步函数getSignedUrl(键){
设params={Bucket:bucketName,Key:Key};
让url=wait s3.getSignedUrl('getObject',params,(err,url)=>{
如果(错误)拒绝(错误)
返回url;
});
}
异步函数过程(项){
对于(让项目中的项目){
const signedUrl=wait getSignedUrl(item.fileName);
item.url=signedUrl;
}
退货项目;
}
过程(结果)。然后(res=>{
控制台日志(res);
});代码>
注意:如果您正在处理一系列可能的承诺,最好使用Promise.all()
,因为wait
会在异步函数中停止该代码的执行(而不是事件循环),即使它是一个无阻塞函数。在这种情况下,执行并行请求的速度要快得多您只能将wait
与返回承诺的函数一起使用,而不是接受回调的函数。谢谢您的回答。这对我帮助很大。我只需删除let url=await s3.getSignedUrl中的'await'即可使其正常工作。我会尽力履行承诺的。好的,等会儿。。3.我忘了取下行李。。感谢您指出这一点。文档似乎说getSignedUrl的getObject版本是同步的,为什么需要等待同步代码?
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);
});