我需要确定是否需要顺序或并行上传照片(调用Upload API).

顺序是指在上传图片时(调用Upload接口),等待第一个图片解析完成后显示图片,然后再调用下一个上传接口.

并行意味着当您上传图像时,您将首先显示任何已解析的图像.因此,您可以同时显示图像,因为可以在此处解析多个响应.

我想要有一个条件,即在一个条件中是连续的还是并行的 uploadPhotos个动作. 条件是当它包含相同的文件名时使用顺序,例如,如果您上传AA_11-01.jpg,则您上传AA_11-02.jpg,否则使用并行.

永远记住,只确定它是否在过go -xxx年之前

例如.

aa_11-01.jpg        -      aa_11
aa-11-01.jpg        -      aa-11
aa.jpg              -      aa
aa-12j-14kkk.jpg    -      aa-12j
test-a.jpg          -      test
test-b.jpg          -      test

Parallel

export const uploadPhotos =
  ({ photos, size, controller }) =>
  async (dispatch) => {
    photos.forEach(async (photo, index) => {
      const formData = new FormData();
      formData.append(photo?.imageFileName, photo?.imageFile)

      dispatch({ type: constants.UPLOAD_PHOTOS_START, size });
      try {
        const response = await axios.post(
          `${API_URL}/photos/upload`,
          formData,
          {
            onUploadProgress({ loaded, total }) {
              dispatch(setUploadProgress({ id: index, loaded, total }));
            },
            signal: controller.signal,
          }
        );

        dispatch({
          type: constants.UPLOAD_PHOTOS_SUCCESS,
          payload: response.data,
        });
      } catch (error) {
        dispatch({
          type: constants.UPLOAD_PHOTOS_FAILURE,
          payload: error,
        });
      }
    });
  };

Sequential

export const uploadPhotos =
      ({ photos, size, controller }) =>
      async (dispatch) => {
        for (const [index, photo] of photos.entries()) {
          const formData = new FormData();
            formData.append(photo?.imageFileName, photo?.imageFile)
    
          dispatch({ type: constants.UPLOAD_PHOTOS_START, size });
          try {
            const response = await axios.post(
              `${API_URL}/photos/upload`,
              formData,
              {
                onUploadProgress({ loaded, total }) {
                  dispatch(setUploadProgress({ id: index, loaded, total }));
                },
                signal: controller.signal,
              }
            );
    
            dispatch({
              type: constants.UPLOAD_PHOTOS_SUCCESS,
              payload: response.data,
            });
          } catch (error) {
            dispatch({
              type: constants.UPLOAD_PHOTOS_FAILURE,
              payload: error,
            });
          }
        }
      };

推荐答案

在发出任何请求之前,您可以首先分析文件名并将数组分组为子数组,其中子数组的文件名具有"name-equence.ext"模式("equence"可以是任何东西).没有此序列部分的文件名将作为子数组中的唯一条目结束.

然后混合两个循环,forEach作为外循环,for作为内循环:

export const uploadPhotos = 
  ({ photos, size, controller }) =>
  async (dispatch) => {
    // Identify the part of the file name that excludes the (optional) sequence number
    const keyedphotos = photos.map(photo => [photo.imageFileName.replace(/-\w+\.\w+$/, ""), photo]);
    // Create a group for each such prefix
    const map = new Map(keyedphotos.map(([key]) => [key, []]));
    // Populate those groups
    for (const [key, photo] of keyedphotos) map.get(key).push(photo)
    // And extract those groups into an array (of subarrays)
    const photoGroups = [...map.values()];
    let index = 0; // Keep the index counter separate

    photoGroups.forEach(async (photos) => { // Iterate the groups that can run in parallel
      for (const photo of photos) { // Iterate the photos that should run sequentially
        const id = index++; // Get the next unique id
        const formData = new FormData();
        formData.append(photo?.imageFileName, photo?.imageFile)

        dispatch({ type: constants.UPLOAD_PHOTOS_START, size });
        try {
          const response = await axios.post(
            `${API_URL}/photos/upload`,
            formData,
            {
              onUploadProgress({ loaded, total }) {
                dispatch(setUploadProgress({ id, loaded, total })); // Use id
              },
              signal: controller.signal,
            }
          );

          dispatch({
            type: constants.UPLOAD_PHOTOS_SUCCESS,
            payload: response.data,
          });
        } catch (error) {
          dispatch({
            type: constants.UPLOAD_PHOTOS_FAILURE,
            payload: error,
          });
        }
      }
    });
  }; 

Javascript相关问答推荐

JS生成具有给定数字和幻灯片计数的数组子集

react 路由加载程序行为

通过使用100%间隔时间来代表我们还剩多少时间来倒计时

模块与独立组件

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

Snowflake JavaScript存储过程返回成功,尽管预期失败

如何在mongoose中链接两个模型?

Chart.js-显示值应该在其中的引用区域

从页面到应用程序(NextJS):REST.STATUS不是一个函数

确保函数签名中的类型安全:匹配值

使用带有HostBinding的Angular 信号来更新样式?

如何在JAVASCRIPT中合并两组对象并返回一些键

如何在一个对象Java脚本中获取不同键的重复值?

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

使用createBrowserRoutVS BrowserRouter的Reaction路由

通过解构/功能组件接收props-prop验证中缺少错误"

脚本语法错误只是一个字符串,而不是一个对象?

由于http.get,*ngIf的延迟很大