FileReader的Promise函数过早解析

时间:2018-05-10 18:35:34

标签: javascript angular promise

我打开一个文件来阅读这样的内容:

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时,它会立即返回一个已解析的promise,其中包含来自convertBlobToBase64的已转换数据,而不是一个应该按预期等待nextPromise的未解析的promise。

相反,myFunction的.then立即被调用并失败,因为它没有正确的数据。我误解了Promise的功能吗?

2 个答案:

答案 0 :(得分:1)

试试这段代码:

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

答案 1 :(得分:1)

顺便说一句,你不需要为函数包装另一个承诺。您可以将postCall用作解析函数并将其链接为:

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