如何读取 Angularjs 中工厂中的文件数组?

How to read array of files in a factory in Angularjs?

我有一组文件。我想阅读所有这些内容并从中制作一个 json 数组。问题是 d3.csv 是一个异步函数。

问题中,我了解到 $q.defer() 必须用于向控制器返回延迟承诺。

我的问题是我必须读取文件数组并制作相应的对象数组。

目前的代码如下:

myApp.factory('myFactory', function($q) {

  var masterData=[];

  var visFolder = "/data/";
  var files=[(visFolder + "Crime_full1.csv"),(visFolder + "accidents.csv"),(visFolder + "health.csv")];


  return {
      // Get all masterData
      get: function() {
        var deferred = $q.defer();

        //I want to read all the files in array 
        d3.csv(files[0], function(d) {
          masterData.push(d);
          deferred.resolve(masterData);
          console.log("a csv file read");
        });

        return deferred.promise;

      }

    }
  });


myApp.controller('visCtrl', function($scope, $routeParams,myFactory) {

  myFactory.get().then(function(masterData) {

    //masterdata should contain data of all the files in an array
    $scope.masterData = masterData;
  });

});

您必须遍历文件数组并调用为每个文件调用 d3 库的函数。这个功能应该return承诺。下面的 getFile 函数执行相同的操作:

getFile = function (file) {
    var deferred = $q.defer();
    d3.csv(file, function (d) {
        deferred.resolve(d);
    });
    return deferred.promise;
}

getFile 函数定义在 return 块之外。 get 函数现在必须更新为对每个文件调用 getFile,然后用 $q.all 整理结果。代码看起来像这样。

get: function () {

    var promises = files.map(function (f) {
        return getFile(f);
    });

    return $q.all(promises).then(function (data) {
        data.forEach(function (f) {
            masterData.push(f);
        });
        return masterData;
    });
}