当前位置: 首页 > 知识库问答 >
问题:

使用promise。all()将多个图像上载到AWS s3。如何处理只有一个图像无法上载的错误?

林玮
2023-03-14

我正在尝试使用签名 URL 将多个图像上传到 s3 存储桶。流程是前端应用向服务器发送 GET 请求,以获取要上传的每个图像的签名 URL。然后,前端应用程序使用签名的 URL 将图像直接上传到 s3 存储桶。

我的问题是我如何处理一张图片上传失败的情况?

例如,如果我想上传三个图像,而其中一个未能上传,在让用户尝试再次上传文件之前,我是否必须从s3存储桶中删除另外两个图像?

/*
 * @param {array} images: Array of objects of shape ({image: object, signedUrl: string})
 * 
 */

const uploadImages = (images) => {
    const axiosPutPromises = images.map(({ image, signedUrl }) => {
      const putFile = () => axios.put(signedUrl, image, {
        headers: {
          "Content-Type": image.type
        }
      });
      
      return putFile();
    });
    
    try {
      const res = await axios.all(axiosPutPromises);
      // dispatch res to redux store

    } catch (err) {
      /*Not sure how to handle error where only one files fails to upload*/
    }

共有2个答案

艾鹭洋
2023-03-14

所有的人都使用promise,所有人都在引擎盖下。promise,一切都是全有或全无。一旦阵列中的所有promise都解决,它就会解析,或者一旦其中一个promise被拒绝,它就会拒绝。换句话说,它要么使用包含所有已解析值的数组进行解析,要么使用单个错误进行拒绝。

默认情况下,您的用例应该以这种方式处理。

郭志泽
2023-03-14

我没有使用过axios,但是我在一个使用常规promise的项目中处理这个问题的方式是避免拒绝。

因此,我捕获每个工作promise中的任何错误,然后接受具有结构化值的promise,使我能够区分成功与失败。然后,您可以检查 Promise.all() 返回的数组,并在那里执行所需的任何错误处理。

 类似资料: