Node.js NodeJS-使用承诺散列文件流
我现在有一个进程,它可以对文件进行统计和散列(可能很大)。现在我是这样做的:Node.js NodeJS-使用承诺散列文件流,node.js,file,stream,promise,es6-promise,Node.js,File,Stream,Promise,Es6 Promise,我现在有一个进程,它可以对文件进行统计和散列(可能很大)。现在我是这样做的: function gen_hash (fn, callback) { var hash = crypto.createHash('sha256'); var fh = fs.createReadStream(fn); fh.on('data', d => hash.update(d)); fh.on('end', () => { var digest = hash.digest('
function gen_hash (fn, callback) {
var hash = crypto.createHash('sha256');
var fh = fs.createReadStream(fn);
fh.on('data', d => hash.update(d));
fh.on('end', () => {
var digest = hash.digest('hex');
});
}
function gen_stat (fn, callback) {
fs.stat(fn, function (err, stats) {
if (err) {
if (err.code == "ENOENT") {
file.exists = false;
}
}
}
}
然后我有一些代码,当它们都完成时,允许回调。正如你所能想象的,这相当。。。牵涉其中
我认为这是一个很好的承诺匹配,但我不知道如何使用它们
我试过一些东西,比如:
const Promises = require('bluebird');
const fs = Promises.promisifyAll(require('fs'));
fh = fs.createReadStream(fn)
.then...
.error...
但我真的不明白该怎么做,蓝鸟的网站似乎缺少细节
我感觉像是Promise.所有的可能都是正确的,但我只是没有看到任何正确语法的好例子
我知道我可以编写一个包装器函数,在各种条件下返回一个承诺,但我不太明白它在promise land中是如何工作的。也许是这样的
const fs = Promise.promisifyAll(require('fs'));
function promise_checksum (fn) {
return new Promise((fulfill, reject) => {
// What goes here...?
}
}
function promise_stat (fn) {
return new Promise((fulfill, reject) => {
fs.stat(fn).then((err, stats) => {
if (err) {
reject(err);
} else {
fulfill(stats);
}
}
}
}
function checksum_and_stat (fn) {
return new PromiseAll((fulfill, reject) => {
// What goes here?
});
}
帮助?您可以将您的函数包装成这样的承诺:
function gen_hash (fn) {
return new Promise((resolve, reject) => {
var hash = crypto.createHash('sha256');
var fh = fs.createReadStream(fn);
fh.on('data', d => hash.update(d));
fh.on('end', () => {
var digest = hash.digest('hex');
resolve(digest);
});
fh.on('error', reject);
});
}
示例用法:
gen_hash(someFileName).then(hash => {
console.log("hash is: ", hash);
}).catch(err => {
console.err(err);
});
对于node.jsfs
模块中的常规函数,您可以使用Bluebird来提示它们
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
这将在fs
对象上创建以Async结尾的新方法(除了作为标准fs
模块一部分的常规方法之外),这些新方法将返回承诺,而不是接受回调。Bluebird将对这些方法中的每一个进行填充,并提供自己的回调来为您管理承诺。下面是一个例子:
fs.statAsync(someFileName).then(stats => {
console.log(stats);
}).catch(err => {
console.err(err);
});
Promise.all()
用于您有多个单独的承诺,并且希望知道这些承诺何时全部兑现。它接受一个承诺数组作为参数,并返回一个新的主承诺,该主承诺将使用一个值数组进行解析,或者在发生第一个错误时拒绝。所以,你可以这样做:
function checksum_and_stat (fn) {
return Promise.all([gen_hash(fn), fs.statAsync(fn)]);
}
checksum_and_stat(someFileName).then(args => {
console.log("hash: ", args[0]);
console.log("stats: ", args[1]);
}).catch(err => {
console.err(err);
});
您可以将函数包装为这样的承诺:
function gen_hash (fn) {
return new Promise((resolve, reject) => {
var hash = crypto.createHash('sha256');
var fh = fs.createReadStream(fn);
fh.on('data', d => hash.update(d));
fh.on('end', () => {
var digest = hash.digest('hex');
resolve(digest);
});
fh.on('error', reject);
});
}
示例用法:
gen_hash(someFileName).then(hash => {
console.log("hash is: ", hash);
}).catch(err => {
console.err(err);
});
对于node.jsfs
模块中的常规函数,您可以使用Bluebird来提示它们
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
这将在fs
对象上创建以Async结尾的新方法(除了作为标准fs
模块一部分的常规方法之外),这些新方法将返回承诺,而不是接受回调。Bluebird将对这些方法中的每一个进行填充,并提供自己的回调来为您管理承诺。下面是一个例子:
fs.statAsync(someFileName).then(stats => {
console.log(stats);
}).catch(err => {
console.err(err);
});
Promise.all()
用于您有多个单独的承诺,并且希望知道这些承诺何时全部兑现。它接受一个承诺数组作为参数,并返回一个新的主承诺,该主承诺将使用一个值数组进行解析,或者在发生第一个错误时拒绝。所以,你可以这样做:
function checksum_and_stat (fn) {
return Promise.all([gen_hash(fn), fs.statAsync(fn)]);
}
checksum_and_stat(someFileName).then(args => {
console.log("hash: ", args[0]);
console.log("stats: ", args[1]);
}).catch(err => {
console.err(err);
});
太好了,谢谢。这将许多松散的事情联系在一起,并有助于实现“点击”的承诺。在这里,你可能需要小心。hash.update正在阻塞,将阻塞事件循环。我可能会使用软件包来避免这种情况。@JTWebMan-请将您的评论转到OP上,因为加密是他们的选择。太好了,谢谢。这将许多松散的事情联系在一起,并有助于实现“点击”的承诺。在这里,你可能需要小心。hash.update正在阻塞,将阻塞事件循环。我可能会使用软件包来避免这种情况。@JTWebMan-请将您的评论转到OP上,因为加密是他们的选择。