异步/等待循环遍历数组以获取 s3 签名 URL

Ele*_*off 0 javascript asynchronous node.js async-await

我已经编写了以下代码。输入(结果)是 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);
});
Run Code Online (Sandbox Code Playgroud)

问题是当我 console.log 结果时,新的 URL 不存在。我无法弄清楚问题是什么。我猜这是一个异步问题,但我没有足够的经验来弄清楚。

小智 10

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);
});
Run Code Online (Sandbox Code Playgroud)

注意:Promise.all()如果您正在处理一组可能的承诺,最好使用它,因为即使它是一个无阻塞函数,也会await停止在异步函数 (而不是事件循环)中执行该代码。在这种情况下执行并行请求要快得多