【问题标题】:How do i wait for promises to get resolved?我如何等待承诺得到解决?
【发布时间】:2021-02-02 07:14:03
【问题描述】:
    try {
              (async ()=> await Promise.all(this.state.selectedFile.map(picture =>
                new Promise((resolve, reject) => {
                  Firebase.getStorageRef(`/${picture.name}`)
                    .put(picture)
                    .on('state_changed', (snapshot) => {
                      // progress function ....
                      const progress = Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 100);
                      console.log("Progress: ", progress)
                    },
                    reject,
                    () => {
                      // complete function .... 
                      Firebase.getStorageRef(`/${picture}`)
                    .getDownloadURL()
                    .then(url => {
                      this.setState({mage:this.state.mage.concat([url])})
                      console.log(this.state.mage,"yooo")
                    });
                });
              })
          )).then( Firebase.getDatabaseRef().push({
                  
                  image:[this.state.mage],
     
                  thumbImage:[this.state.mage]
                
                }).then(()=>{
                  console.log("added")
                })))();
        } catch (error) {
          console.error(error);
        }

在上面的代码中,使用 Promise 上传了一个图像列表。上传每张图片时的所有方法都使用 .then() 方法将 url 存储在一个列表中,以将其传递给另一个 .then() 并将其存储在数据库中。

错误:

图片的url为空,因为它在上传完成之前被执行。

上传完成后不是.then()方法负责执行吗?

【问题讨论】:

    标签: reactjs asynchronous firebase-realtime-database async-await firebase-storage


    【解决方案1】:

    您使用return Promise((resolve, reject) => { 返回一个自定义承诺,但您永远不会调用resolve。这意味着您的承诺永远不会解决,因此Promise.all() 方法的then 永远不会被调用。

    我认为您不需要自定义承诺,因为 put 已经返回了您可以使用的承诺。

    我会从这样的开始:

    const promises = this.state.selectedFile.map(picture => {
      const ref = Firebase.getStorageRef(`/${picture.name}`);
      return ref
        .put(picture)
        .then(() => ref.getDownloadURL());
    });
    Promise.all((downloadUrls) => {
      this.setState({ mage: downloadUrls })
      Firebase.getDatabaseRef().push({
        image: downloadUrls
      })
    })
    

    请注意,我没有运行上面的代码,所以可能会有一些小错误。如果您遇到此类错误,请尝试通过搜索错误消息来修复它们。

    【讨论】:

    • 嘿弗兰克,在上面的代码中,图片列表被异步添加到数据库中,并返回每个 URL 的承诺。你如何引用 Promise.all 中的 map 函数返回的每个单独的承诺将所有 URL 存储在状态数组中?
    • 在完成所有对getDownloadURLs 的上传和调用之后,我将立即将所有 URL 设置为状态和数据库。如果您想在每个完成的单独上传中执行此操作,则需要为此修改代码。在这种情况下,您的代码中的问题仍然与我在答案的第一段中指出的相同。
    猜你喜欢
    • 2020-10-17
    • 2019-09-23
    • 1970-01-01
    • 2019-04-29
    • 2017-05-25
    • 2022-01-17
    • 2018-04-02
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多