【问题标题】:Firebase image upload in async await mannerFirebase图像以异步等待方式上传
【发布时间】:2019-09-12 07:59:21
【问题描述】:

async UPLOAD_IMAGES() {
      try {
        let self = this;
        var storageRef = firebase.storage().ref();
        var files = document.getElementById("photoupload").files;
        var file = files[0];
        // Create the file metadata
        var metadata = {
          contentType: "image/jpeg"
        };

        // Upload file and metadata to the object 'images/mountains.jpg'
        var uploadTask = storageRef
          .child(`${this.name}/` + file.name)
          .put(file, metadata);

        // Listen for state changes, errors, and completion of the upload.
        uploadTask.on(
          firebase.storage.TaskEvent.STATE_CHANGED, // or 'state_changed'
          function(snapshot) {
            // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded
            var progress =
              (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
            console.log("Upload is " + progress + "% done");
            switch (snapshot.state) {
              case firebase.storage.TaskState.PAUSED: // or 'paused'
                console.log("Upload is paused");
                break;
              case firebase.storage.TaskState.RUNNING: // or 'running'
                console.log("Upload is running");
                break;
            }
          },
          function(error) {
            // A full list of error codes is available at
            // https://firebase.google.com/docs/storage/web/handle-errors
            switch (error.code) {
              case "storage/unauthorized":
                // User doesn't have permission to access the object
                break;

              case "storage/canceled":
                // User canceled the upload
                break;
              case "storage/unknown":
                // Unknown error occurred, inspect error.serverResponse
                break;
            }
          },
          function() {
            // Upload completed successfully, now we can get the download URL
            uploadTask.snapshot.ref
              .getDownloadURL()
              .then(function(downloadURL) {
                console.log("File available at", downloadURL);
                self = downloadURL;
              });
          }
        );
      } catch (error) {
        console.log("ERR ===", error);
        alert("Image uploading failed!");
      }
    }

这是我的图片上传功能。我唯一的问题是它在这个函数中有回调函数。

 function() {
            // Upload completed successfully, now we can get the download URL
            uploadTask.snapshot.ref
              .getDownloadURL()
              .then(function(downloadURL) {
                console.log("File available at", downloadURL);
                self = downloadURL;
              });
          } 

只有这部分才能获得异步等待功能?

【问题讨论】:

  • 您的问题是什么?你想使用 async/await 吗?
  • @jackz314 是的!我也标记了正确答案。

标签: javascript firebase firebase-storage


【解决方案1】:

您可以很好地在UploadTask 上致电then(),如下所述:https://firebase.google.com/docs/reference/js/firebase.storage.UploadTask#then

此对象的行为类似于 Promise,并通过其快照解析 上传完成时的数据。

所以你可以这样做:

async UPLOAD_IMAGES() {
      try {
        let self = this;
        const storageRef = firebase.storage().ref();
        const files = document.getElementById("photoupload").files;
        const file = files[0];
        // Create the file metadata
        const metadata = {
          contentType: "image/jpeg"
        };

        const fileRef = storageRef
          .child(`${this.name}/` + file.name);

        const uploadTaskSnapshot = await fileRef.put(file, metadata);

        const downloadURL = await uploadTaskSnapshot.ref.getDownloadURL();

        self = downloadURL;

      } catch (error) {
        console.log("ERR ===", error);
        alert("Image uploading failed!");
      }
    }

【讨论】:

  • 感谢您的回答。是否可以使用 async/await 但仍监控上传状态(为用户提供大文件的反馈)?
  • 不,如果你想通过on()方法monitor the upload progress,你不能使用async/await,因为这个方法是基于回调的。您可以将其封装在一个 Promise 中,该 Promise 会在上传完成后解决,但随后您会失去观察者的能力(实际上您不需要这样做 => 如果需要这样做,只需使用 then(),如回答。)
  • 感谢您的解释。这是否意味着我们无法避免这种情况下的回调:A 调用 B 调用 C 调用 D,它会上传文件。在 D 上传文件后,我们需要 A 之后的代码来运行 -- 但不是之前。
  • 再次感谢您的帮助。我们添加了一个答案以建立您的精彩答案,以防有人遇到我们遇到的情况。
【解决方案2】:

如果有人在使用 await/async 而不是回调时需要同时观察上传进度,则此代码有效:

try {
   await saveToFirebase();
   alert("Happy days!");
} catch (error) {
   alert("Sad days!");
}


async function saveToFirebase() {
   // Create promise.
   let promise = $.Deferred();

   // Set storage reference.
   let storageRef = firebase.storage().ref();

   // Se file path.
   let filepath = "your-path.txt";

   // Set content type.
   let metadata = {
      contentType: "text/plain",
      cacheControl: "no-cache, max-age=0"
   };

   // Start upload.
   let uploadTask = storageRef.child(filepath).putString(data, "raw", metadata);

   // Monitor state of upload operation.
   uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED, function(snapshot) {
      // Get task progress, including number of bytes uploaded and total number of bytes to be uploaded.
      let progress = (snapshot.bytesTransferred / snapshot.totalBytes);
      
      // Display progress to user.

   // Error during upload?
   }, function(error) {
      promise.reject(error);

   // Nope, upload succeeded.
   }, function() {
      promise.resolve();
   });

   // Return promise.
   return promise;
}

【讨论】:

  • 感谢您的回复!看到一个普通的 javascript 方法会很好,不是每个人都使用 JQuery。
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 2019-04-08
  • 2019-11-08
  • 2018-09-13
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多