[Javascript] Comment passer le contenu du service à un autre service au contrôleur avec des rappels après qu'il a été analysé?


Answers

Question

J'ai un service qui utilise une fonction de rappel pour transmettre le contenu à un contrôleur:

  angular.module('piApp').service("dataRetrievalService", function () {

  function getContents(callback) {
      //Converter Class 
      var fs = require("fs");
      var Converter = require("csvtojson").Converter;
      var fileStream = fs.createReadStream("order.csv");
      //new converter instance 
      var converter = new Converter({ constructResult: true });
      //end_parsed will be emitted once parsing finished 
      converter.on("end_parsed", function (jsonObj) {
          console.log(jsonObj); //here is your result json object 
          //getResult(jsonObj)
          callback(jsonObj);
      });
      //read from file 
      fileStream.pipe(converter);
  }

  // public api
  return {
      getContents: getContents
  }
})

Ce service utilise le module de noeud csvtojson pour obtenir le contenu d'un fichier csv en tant que JSON. Et voici le contrôleur qui l'utilise:

angular.module('piApp').controller('homeController', ['$scope', 'dataRetrievalService', function ($scope, dataRetrievalService) {

     dataRetrievalService.getContents(function(contents) {
     $scope.result = contents;
     });

}]);

Je me demande comment je pourrais déplacer correctement la logique d'analyse vers un autre service qui est injecté dans dataRetrievalService et obtenir toujours le contenu du fichier csv sur le contrôleur après qu'il a été analysé.

Donc mon nouveau csvService serait

angular.module('piApp').service("csvService", function () {
// public methods

function getCsvAsJSON(callback) {
    //Converter Class 
    var fs = require("fs");
    var Converter = require("csvtojson").Converter;
    var fileStream = fs.createReadStream("Contents/Product Groups/orderTest2.csv");
    //new converter instance 
    var converter = new Converter({ constructResult: true });
    //end_parsed will be emitted once parsing finished 
    converter.on("end_parsed", function (jsonObj) {
        console.log(jsonObj); //here is your result json object 
        callback(jsonObj);
    });
    //read from file 
    fileStream.pipe(converter);
}


// public api
return {
    getCsvAsJSON: getCsvAsJSON
}
})

Et mon dataRetrievalService devient quelque chose comme

angular.module('piApp').service("dataRetrievalService", ['csvService', function (csvService) {

    function getContents() {

        csvService.getContents(function (contents) {
            this.result = contents; //should I be using another callback here instead?
        });
    }
    // public api
    return {
        getContents: getContents
    }
}])

J'ai du mal à imaginer comment cela fonctionnerait pour que je passe un second rappel au contrôleur et toujours obtenir le contenu désiré. Comment II peut-il transmettre le contenu du service au contrôleur APRÈS qu'il a été analysé?

Merci beaucoup pour votre temps. Faites-moi savoir si vous avez besoin d'informations supplémentaires ou si je ne suis pas clair.

Cette question est une extension de ce post précédent




Links