异步/等待上传任务

2024-02-02

我如何等待 uploadTask 以便在将下载 url 和文档插入到 firestore 之前先上传图像/文件并跟踪其进度,

以下代码是我的示例 Vue 项目。它工作正常,但请参阅if (portraitFile),必须满足我必须上传图片的条件,如果我不想上传图片怎么办?

它必须移出该条件if,但它将在文件完成并检索下载 URL 之前异步执行。

目标:将 firestore add() 移到 uploadTask 的完成回调/参数之外。

    async commitCharacter() {
      try {
        let character = this.character;
        let portraitFile = this.portraitFile;

        if (portraitFile) {
          const uploadTask = storageRef
            .child(`characters/${character.id}/portrait.png`)
            .put(portraitFile, { contentType: "image/png" });

          await uploadTask.on(
            "state_changed",
            snapshot => {
              this.portraitUploadProgress =
                (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
            },
            null,
            async () => {
              character.portraitUrl = await storageRef
                .child(`characters/${character.id}/portrait.png`)
                .getDownloadURL();

              if (character.id) {
              await db
                .collection("characters")
                .doc(character.id)
                .update(character);
              } else {
                character.id = (await 
                db.collection("characters").add(character)).id;
              }

              $("#manageCharacter").modal("hide");
            }
          );
        }
      }

你可以把你的uploadTask承诺:

async function uploadTaskPromise() {
  return new Promise(function(resolve, reject) {
    const storageRef = storage.ref(YOUR_STORAGE_PATH)
    const uploadTask = storageRef.put(YOUR_FILE_OR_BLOB)
    uploadTask.on('state_changed',
      function(snapshot) {
        var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100
        console.log('Upload is ' + progress + '% done')
      },
      function error(err) {
        console.log('error', err)
        reject()
      },
      function complete() {
        uploadTask.snapshot.ref.getDownloadURL().then(function(downloadURL) {
          resolve(downloadURL)
        })
      }
    )
  })
}

然后像这样使用它:

const storageUrl = await uploadTaskPromise()
console.log(storageUrl) // do whatever you want with the URL...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步/等待上传任务 的相关文章

随机推荐

  • USPS API 返回 80040B19 错误代码并且帐户处于生产状态

    所以我的问题是根据文档 这非常薄 而且不是最好的 我拥有的 xml 是所需的一切 但我得到了这个错误代码
  • 如何计算斜边和方位角

    我通过此链接从 DanS 获得了以下代码如何显示带有移动当前位置的地图静止图像文件 https stackoverflow com questions 7062115 android how to display a map still i
  • 调整图像大小并更改其深度

    我需要调整 IplImage 的大小并将其转换为不同深度的 CvMat 这是我到目前为止编写的代码 void cvResize2 IplImage imgSrc IplImage imgDst IplImage imgTemp imgTem
  • 选择如何使用 JSF 将参数传递到目标 bean/页面

    我已经使用 JSF 几年了 但在决定如何将参数传递到目标页面 bean 时我仍然心存疑虑 我确实认为这个问题有点复杂 有些人可能会告诉我将其分解为更小的问题 但是 我还认为以下所有问题的答案都是相关的 并且它解决了当您希望 JSF 做的只是
  • 如何在 UWP 中打印 PDF 且光栅化为 PNG 后不损失质量

    在对 UWP 中的打印进行一些调查之后 我强调了 如果不将此任务重定向到 Edge 或其他类似程序 则没有直接从应用程序打印 PDF 文档的本机方法 有一种方法可以使用打印 XAML 元素 例如图像 打印文档 有一种将 PDF 渲染为 PN
  • 设置 ant bootclasspath:JDK 1.7 有一个新的 javac 警告,用于设置没有 bootclasspath 的旧源

    如何将 ant bootclasspath 与 source 1 5 target 1 5 结合使用 这怎么可能不是 1 5 JDK 的硬编码路径呢 我可以将环境变量设置为 bootclasspath 类似于从 ant 使用 JAVA HO
  • 套接字连接被中止 - WCF

    我有一个简单的客户端服务器应用程序 当我启动服务器并通过客户端发送消息时 它使用 WCF netTcpBinding 一切正常 但是当我手动关闭服务器并再次打开它时 无需在以下位置关闭客户端应用程序 所有 下次客户端尝试向服务器发送消息时
  • Objective-C 中的 AES 字符串加密

    我的 Objective C 应用程序需要做string加密 特别是nsstring questions tagged nsstring 我发现 AES 是可供消费者使用的最安全的加密方法 我也了解如何将字符串转换为NSData然后回来 只
  • 如何为类本身(而不是类的实例)选择自定义字符串表示形式?

    考虑这个类 class foo object pass 默认的字符串表示形式如下所示 gt gt gt str foo
  • 如何使用 UI-Router 仅更新命名视图

    我正在创建一个网络应用程序来帮助学生学习科学 历史和数学 当您第一次登陆该网站时 我有一个主页 登陆页面 当您单击 开始 时 我会转到 exam instructions 我的每个步骤都说明了我加载到的模板中的数学和科学ui view ex
  • IBAction、IBOutlet 等中的 IB 是什么意思?

    我对 iPhone 开发非常陌生 我经常遇到IBAction IBOutlet阅读 Objective C 和 Swift 代码时等等 什么是IB代表 界面生成器 在 Xcode 4 之前 接口文件 XIB 和 NIB 是在名为 Inter
  • 尽管没有使用布尔值,但我得到“类型不匹配无法从 int 转换为布尔值”

    我正在 Java如何编程 一书中做练习 我应该制作一个模拟抛硬币的应用程序 我应该创建一个方法 翻转 它随机返回硬币的一面 我决定让该方法返回 1 或 2 并且在主方法中我将这些值 转换 为硬币的一面 问题是我收到一条错误消息 类型不匹配
  • TextView 中的链接

    我需要将链接放在TextView 我有一个包含标签的字符串 a href link Text for link a 和一些其他文字 问题是 如果我运行该项目 我可以看到文本 但不可单击 我尝试过 b 也标记一下看看是否有效 但似乎也不起作用
  • tm.package:findAssocs 与 Cosine

    我是新来的 我的问题是数学问题而不是编程性质 我想就我的方法是否有意义获得第二意见 我试图使用该函数在我的语料库中找到单词之间的关联findAssocs 来自tm包裹 尽管它在通过该包提供的数据 例如 纽约时报 和美国国会 上表现得相当不错
  • PHP:使用 DOMPDF 自动将动态 PDF 保存到远程服务器

    我正在使用 dompdf 库创建基于表格的 PDF 我可以在线查看它 也可以将其下载到选择的用户文件夹中 但我想做的是将其保存到远程服务器 我不需要将其保存到用户电脑 就像一个自动上传脚本 它会创建文件然后将其上传到远程服务器 所以我稍后可
  • 为什么 UnderscoreJS 对许多原生 Javascript 函数有包装函数?

    我注意到UnderScoreJS http underscorejs org isArray有很多围绕原生 Javascript 函数的包装函数 举个例子 isArray isBoolean isNaN 这有什么原因吗 或者这些只是为了确保
  • 将值从BackgroundWorker DoWork 传递到BackgroundWorker Completed

    我如何传递一个值BackgroundWorker DoWork to BackgroundWorker Completed Since BackgroundWorker Completed不被调用BackgroundWorker DoWor
  • 获取 javascript 对象中的最后一项

    如果我有一个像这样的对象 a apple b banana c carrot 如果我事先不知道列表会上升到 c 除了循环遍历对象之外 是否有办法获取对象中的最后一项 例如 carrot 是的 有一种方法可以使用Object keys obj
  • setProgressDrawable 填充整个seekBar

    正如我在标题中所说 当我使用 setProgressDrawable 时 它 会填充整个 SeekBar 如果进度为 34 则进度显示 100 但拇指显示正确的百分比为 34 我不明白可能是什么问题 done setProgressDraw
  • 异步/等待上传任务

    我如何等待 uploadTask 以便在将下载 url 和文档插入到 firestore 之前先上传图像 文件并跟踪其进度 以下代码是我的示例 Vue 项目 它工作正常 但请参阅if portraitFile 必须满足我必须上传图片的条件