javascript - FileReader JS Api 在准备就绪之前调用 Fire

标签 javascript jquery angularjs filereader angularjs-http

我正在尝试读取一个文件,创建一个“FileContainer”,并从 fileReader 中创建一个 DataUrl,以便我可以将其发送到 Web api。

我的问题是 Api 调用在创建对象之前触发,因此我将 Null 发送到 api。这意味着如果我发送一个小文件,它就可以工作。

我为读者提供的代码看起来像这样

var reader = new FileReader();
reader.onload = (function (theFile) {
    return function (e) {
        var newFile = {
            name: theFile.name,
            type: theFile.type,
            size: theFile.size,
            lastModifiedDate: theFile.lastModifiedDate
        }
        var binaryString = e.target.result;
        updloadedFile(newFile, binaryString, selectedFolder, scope, fileProgrss);
        }
    };
})(f);
reader.readAsDataURL(f)

还有我的 http.post 调用

function updloadedFile(file, data, selectedFolder, scope, fileProgrss) {

    var dummyobj = {
        Name: file.name,
        Extension: file.name.split('.')[0],
        Path: selectedFolder.Path,
        DataString: data,
    }

    $http.post('/api/Files/Upload/',
      JSON.stringify(dummyobj),
      {
          headers: {
              'Content-Type': 'application/json'
          }
      }
  ).success(function (data2) {

  }).error(function (data, status, headers, config) {
  });
}

最佳答案

您需要将您的 FileReader 包装在 promise

function fileReader(file) { // perform async operation
    var deferred = $q.defer();

    var reader = new FileReader();
    reader.onload = function() {
      // Your reader.onload code here
      deferred.resolve(reader.result);
    };        

    reader.readAsDataURL(f);   
    return deferred.promise;
};

然后您可以像这样调用 uploadedFile() 函数:

fileReader().then(function(result){
  updloadedFile(..., ..., ..., ...)
});

通过使用promise对象,您可以使用then访问异步任务完成时的结果。一旦结果可用,then 就会运行。

如果您想了解有关 Promise 的更多信息,请阅读此 SO thread解释得很好。

关于javascript - FileReader JS Api 在准备就绪之前调用 Fire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34587480/

相关文章:

javascript - 单击按钮更改 CSS 样式?

jquery - 如何使用jquery获取github版本的tag_name?

javascript - 如何删除具有特定子项的 jQuery 中的元素?

javascript - AngularJS 选项卡通知

javascript - 服务调用后, Angular 方法未在 Controller 中触发

javascript - 正则表达式提取电子邮件地址

php - 有没有可以缩进混合代码的工具?

javascript - 逐个节点设置 SVG 基本形状

javascript - 清除单元格谷歌表脚本

javascript - 如何在 Yii 框架中使用表单添加 "Novalidate"。我正在使用 Angularjs