[英]Using promises with Node.js functions on example
我开始学习JavaScript Promise,但是我不明白如何将Q函数应用于Node.js回调函数。
在类似的问题中,建议使用Q.denodeify()
,但它对fs.readFile()
效果很好,而对fs.readFile()
则fs.exists()
。
这是一个简单的函数,可返回文件列表及其在目录中的大小:
function openDir(path, callback) {
path = __dirname + path;
fs.exists(path, function (exists) {
if (exists) {
fs.readdir(path, function (err, files) {
if (err) {
throw err;
}
var filesCounter = 0,
filesTotal = files.length,
result = [];
files.forEach(function (filename, index) {
fs.stat(path + filename, function (err, stats) {
if (err) {
throw err;
}
result[index] = {};
result[index].name = filename;
result[index].size = stats.size;
if (++filesCounter === filesTotal) {
callback(result);
}
});
});
});
}
});
}
http.createServer(function (req, res) {
openDir('/', function (data) {
res.writeHead(200, {
'Content-Type': 'application/json; charset=utf-8'
});
res.end(JSON.stringify(data));
});
}).listen(1337, '127.0.0.1');
如何使用Promise(与Q或其他库一起)编写此代码?
fs.exists是一种无用的方法。 它不返回节点样式的回调,通常可以省略。 在您的示例中,您将处理fs.readdir
的错误。
fs.exists()是过时的,仅出于历史原因存在。 几乎永远没有理由在自己的代码中使用它。 节点文档
这是您使用Q重做的示例,请注意,我们通过返回Promise(而不是统计信息本身)将错误处理延迟给调用方。 我提供了一个如何使用Q.defer处理fs.exists的示例,以显示如何代理非节点样式的回调。
var Q = require('q');
var fs = require('fs');
var http = require('http');
var readdir = Q.denodeify(fs.readdir);
function stat(file){
return Q.nfcall(fs.stat, file)
.then(function(stats){
stats.filename = file;
return stats;
});
}
function openDir(path) {
path = __dirname + path;
return readdir(path)
.then(function(files) {
return files.map(function(file){
return stat(path + file); }); })
.then(Q.all);
};
// proxy fs.exists to return a promise. Example of Q.defer
function exists(file){
var deferred = Q.defer();
fs.exists(file, function(result){
return result ? deferred.resolve(file) : deferred.reject('invalid file');
});
return deferred.promise;
}
http.createServer(function (req, res) {
openDir('/').done(
function (data) {
res.writeHead(200, {
'Content-Type': 'application/json; charset=utf-8'});
res.end(JSON.stringify(data));
},
function (err) {
res.writeHead(500, {
'Content-Type': 'application/json; charset=utf-8'});
res.end(JSON.stringify({error: err}));
});
}).listen(1337, '127.0.0.1');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.