【发布时间】:2016-05-14 21:52:09
【问题描述】:
我正在尝试使用 Angular 服务来调用 fs.readFile 或 fs.writeFile,具体取决于按下的按钮类型,以便了解节点和角度承诺如何交互。我所拥有的是读取写入文件,但不会发回读取的数据,也不会抛出任何错误让我了解出了什么问题。
//HTML
<button ng-click="rw('write')">WRITE FILE</button>
<button ng-click="rw('read')">READ FILE</button>
//angular
angular.module('test', [])
.controller('ctrl', function($scope, RWService){
$scope.rw = function(type){
RWService.rw(type)
.then(
function(res){
console.log('success');
},
function(err){
console.log('error');
})
};
})
.service('RWService',['$http', '$q', function($http, $q){
this.rw = function(type){
var promise = $http.get('./rw/' + type);
var dfd = $q.defer();
promise.then(
function(successResponse){
dfd.resolve(successResponse);
},
function(errorResponse){
dfd.reject(errorResponse);
}
);
return dfd.promise;
};
}]);
//node
var fs = require('fs')
, async = require('async')
, Q = require('Q');
var dest = './file.txt';
var rw = {
write: function(data){
data = data.repeat(5);
return Q.nfcall(fs.writeFile, dest, data);
}
, read: function(data){
data = data.repeat(5);
var deferred = Q.defer();
console.log('inside read');
fs.readFile(dest, 'utf8', function(err, data){
if (err){
deferred.reject('some error');
}else{
deferred.resolve(data);
}
});
return deferred.promise;
}
};
module.exports = exports = rw;
//node server
app.get('/rw/:type', function(req, res, next){
var type = req.params.type;
var data = 'some text string\n';
if (type == 'write'){
//omitted fro brevity
}else{
rw.read(data)
.then(function(response){
return {'response': response};
})
.catch(function(err){
return {'index.js error': err};
});
}
});
我构造了 this blog post 的角度 $q 部分。
【问题讨论】:
-
你使用的是什么版本的节点?我个人觉得 Q 很难使用,并且从 0.12 开始,promise 就已经原生于节点。
-
@Andrew 4.0.0。是的,我只是在使用严格的承诺,对如何在没有回调的情况下做到这一点做出最好的猜测。但我肯定愿意接受你的任何建议!谢谢。
标签: javascript angularjs node.js asynchronous promise