Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase多文件上传:如何确保URL按照上传的准确顺序下载?_Javascript_Reactjs_Firebase_Promise_Firebase Storage - Fatal编程技术网

Javascript Firebase多文件上传:如何确保URL按照上传的准确顺序下载?

Javascript Firebase多文件上传:如何确保URL按照上传的准确顺序下载?,javascript,reactjs,firebase,promise,firebase-storage,Javascript,Reactjs,Firebase,Promise,Firebase Storage,以下是我在Firebase上尝试使用我的web应用程序所做的: 让用户定义上载多个文件时的上载顺序 按定义的顺序上载文件 按定义的顺序下载并存储URL,以便传递给另一个函数 下面是执行#2和#3的代码。问题是,虽然文件实际上是按预定顺序上传的,但URL并没有按预定顺序存储。我想原因是getDownLoadURL()是一个异步操作,因此较大文件的URL下载速度较慢,因此存储时间比预期晚。例如,发生如下情况: upload order: [1.jpg, 2.jpg, 3.jpg]; intend

以下是我在Firebase上尝试使用我的web应用程序所做的:

  • 让用户定义上载多个文件时的上载顺序
  • 按定义的顺序上载文件
  • 按定义的顺序下载并存储URL,以便传递给另一个函数
  • 下面是执行#2和#3的代码。问题是,虽然文件实际上是按预定顺序上传的,但URL并没有按预定顺序存储。我想原因是getDownLoadURL()是一个异步操作,因此较大文件的URL下载速度较慢,因此存储时间比预期晚。例如,发生如下情况:

     upload order: [1.jpg, 2.jpg, 3.jpg];
     intended url array: [url_to_1.jpg, url_to_2.jpg, url_to_3.jpg];
     actual url array: [url_to_1.jpg,url_to_3.jpg,url_to_2.jpg];
    
    我对此进行了多次测试,但问题仍然存在

    以下是我试图做的:确保只有在下载并存储URL之后,才能开始上传下一个文件。i、 不是异步的,而是同步的。下面是我目前使用的代码。解决办法是什么

    const url_array_get = () => {
        const user=firebase.auth().currentUser;
        let photos1=null;
        //Code to sort the photos in the intended order
        if (photoorder!==null) {
            photos1 = photoorder.map(position => photos[position - 1]);
        }
        else {
            photos1 = photos;
        }
        //Code to upload the files in the intended order, store the urls, and return them for the next function
        const promises=[];
        photos1.forEach((photo)=> {
            const a=photo.name;
            const a1=a.split('.');
            const b=uuidv4()+'.'+a1[1]; 
            let storageRef=firebase.storage().ref('data/'+user.uid+'/posts/'+b);
              promises.push(
                  storageRef.put(photo).then((snapshot)=>{
                      return snapshot.ref.getDownloadURL()
                  })
              )
         })
        return Promise.all(promises);
    }
    
    提前多谢

    上传文件时,您可以维护一个唯一的(比如日期和时间)键,下载文件时,只需根据该键对其进行排序。这能帮你达到目的吗?上传文件时,你可以保留一个唯一的(比如日期和时间)键,下载文件时,只需根据该键对其进行排序。这会帮助你实现你的目标吗?