代码之家  ›  专栏  ›  技术社区  ›  JWiley

带有FileReader的Promise函数过早解析

  •  1
  • JWiley  · 技术社区  · 6 年前

    我正在打开一个文件以读取如下内容:

    convertBlobToBase64(blob){
        var convertPromise = new Promise(function(resolve, reject){
          var fileReader = new FileReader();
          fileReader.onload = function() {
              var dataUrl = this.result;
              var base64 = dataUrl.split(',')[1];
              resolve(base64);
          };
    
          fileReader.readAsDataURL(blob);
        });
    
        return convertPromise;
      }
    

    然后调用此函数,并在解析时传递结果数据:

    myFunction(audioFile){
        var to64 = this.convertBlobToBase64(audioFile);
        to64.then(function(base64Val){
            var nextPromise = postCall();
            nextPromise.then(//stuff);
            return nextPromise;
        });
    
        return to64;
    } 
    

    然而,当我调用myFunction时,它会立即返回一个已解析的承诺,其中包括来自 convertBlobToBase64 ,而不是应该等待的未解决的承诺 nextPromise 正如所料。

    相反,myFunction的。然后立即调用,由于没有正确的数据而失败。我是否误解了承诺功能?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Anton Harniakou    6 年前

    请尝试以下代码:

    myFunction(audioFile){
        var to64 = this.convertBlobToBase64(audioFile);
        return to64.then(function(base64Val){
            var nextPromise = postCall();
            return nextPromise.then(//stuff);
        });
    } 
    
        2
  •  1
  •   bigless    6 年前

    顺便说一句,您不需要为函数包装另一个承诺。您可以将postCall用作resolve func并按如下方式链接它:

    myFunction(audioFile){
      return convertBlobToBase64(audioFile)
        .then(base64Val => postCall())
        .then(//stuff)
    }