解析后如何通过回调将内容从服务传递到另一个服务到控制器?
How to pass content from service to another service to controller with callbacks after it has been parsed?
我有一个使用回调函数将内容传递给控制器的服务:
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
}
})
此服务使用 csvtojson node module 从 csv 文件获取内容作为 JSON。这是使用它的控制器:
angular.module('piApp').controller('homeController', ['$scope', 'dataRetrievalService', function ($scope, dataRetrievalService) {
dataRetrievalService.getContents(function(contents) {
$scope.result = contents;
});
}]);
我想知道如何将解析逻辑正确地移动到注入到 dataRetrievalService
中的另一个服务,并且在解析后仍然将 csv 文件的内容获取到控制器。
所以我的新 csvService
会是
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
}
})
我的dataRetrievalService
变成了
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
}
}])
我正在努力想象这是如何工作的,以便我将第二个回调传递给控制器并仍然获得所需的内容。解析后如何将内容从服务传递到服务到控制器?
非常感谢您抽出宝贵时间。如果您需要任何其他信息或者我不清楚,请告诉我。
这个问题是
的延伸
分离加载和解析例程是个好主意。但是,使用 promises 比回调更方便。在这种情况下,服务可能是这样的:
angular.module('piApp').service("csvService", function($q) {
// public methods
function getCsvAsJSON() {
var deferred = $q.defer();
var fs = require("fs");
var Converter = require("csvtojson").Converter;
var fileStream = fs.createReadStream("Contents/Product Groups/orderTest2.csv");
var converter = new Converter({constructResult: true});
converter.on("end_parsed", function(jsonObj) {
deferred.resolve(jsonObj);
});
fileStream.pipe(converter);
return deferred.promise;
}
return {
getCsvAsJSON: getCsvAsJSON
}
});
angular.module('piApp').service("dataRetrievalService", ['csvService', function(csvService) {
function getContents() {
return csvService.getCsvAsJSON();
}
return {
getContents: getContents
}
}]);
angular.module('piApp').controller('homeController', ['$scope', 'dataRetrievalService', function ($scope, dataRetrievalService) {
dataRetrievalService.getContents().then(function(contents) {
$scope.result = contents;
});
}]);
我有一个使用回调函数将内容传递给控制器的服务:
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
}
})
此服务使用 csvtojson node module 从 csv 文件获取内容作为 JSON。这是使用它的控制器:
angular.module('piApp').controller('homeController', ['$scope', 'dataRetrievalService', function ($scope, dataRetrievalService) {
dataRetrievalService.getContents(function(contents) {
$scope.result = contents;
});
}]);
我想知道如何将解析逻辑正确地移动到注入到 dataRetrievalService
中的另一个服务,并且在解析后仍然将 csv 文件的内容获取到控制器。
所以我的新 csvService
会是
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
}
})
我的dataRetrievalService
变成了
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
}
}])
我正在努力想象这是如何工作的,以便我将第二个回调传递给控制器并仍然获得所需的内容。解析后如何将内容从服务传递到服务到控制器?
非常感谢您抽出宝贵时间。如果您需要任何其他信息或者我不清楚,请告诉我。
这个问题是
分离加载和解析例程是个好主意。但是,使用 promises 比回调更方便。在这种情况下,服务可能是这样的:
angular.module('piApp').service("csvService", function($q) {
// public methods
function getCsvAsJSON() {
var deferred = $q.defer();
var fs = require("fs");
var Converter = require("csvtojson").Converter;
var fileStream = fs.createReadStream("Contents/Product Groups/orderTest2.csv");
var converter = new Converter({constructResult: true});
converter.on("end_parsed", function(jsonObj) {
deferred.resolve(jsonObj);
});
fileStream.pipe(converter);
return deferred.promise;
}
return {
getCsvAsJSON: getCsvAsJSON
}
});
angular.module('piApp').service("dataRetrievalService", ['csvService', function(csvService) {
function getContents() {
return csvService.getCsvAsJSON();
}
return {
getContents: getContents
}
}]);
angular.module('piApp').controller('homeController', ['$scope', 'dataRetrievalService', function ($scope, dataRetrievalService) {
dataRetrievalService.getContents().then(function(contents) {
$scope.result = contents;
});
}]);