gpt4 book ai didi

node.js - NodeJS - 使用 Promise 对文件流进行哈希处理

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:32 26 4
gpt4 key购买 nike

我现在有一个统计和哈希(可能很大)文件的流程。现在我正在这样做:

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;
}
}
}
}

然后我有一些代码允许在它们都完成时进行回调。正如您可以想象的那样,这相当......复杂。

我认为这与 Promise 非常匹配,但我不知道如何使用它们。

我尝试了一些东西,例如:

const Promises = require('bluebird');
const fs = Promises.promisifyAll(require('fs'));

fh = fs.createReadStream(fn)
.then...
.error...

但我实际上不明白在这里要做什么,并且 Bluebird 网站似乎缺乏详细信息。

我觉得像 Promise.all 这样的东西可能是正确的,但我只是没有看到任何正确语法的好例子。

我知道我可以编写一个包装函数,在各种条件下返回一个 promise ,但我不太明白它在 promise 领域是如何工作的。也许是这样的?

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?
});
}

帮忙?

最佳答案

您可以将函数包装在如下 promise 中:

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.js fs 模块中的常规函数​​,您可以使用 Bluebird 来 Promisify 它们。

const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));

这将在 fs 对象上创建以 Async 结尾的新方法(除了作为标准 fs 模块一部分的常规方法之外),并且,而不是接受回调后,这些新方法将返回一个 promise 。 Bluebird 将调整这些方法中的每一个,并提供它自己的回调来为您管理 promise 。这是一个例子:

fs.statAsync(someFileName).then(stats => {
console.log(stats);
}).catch(err => {
console.err(err);
});
<小时/>

Promise.all() 用于当您有多个单独的 Promise 并且您想知道它们何时全部实现时。它接受一组 Promise 作为参数,并返回一个新的主 Promise,该主 Promise 将使用一组值进行解析,或者在出现第一个错误时拒绝。所以,你可以这样做:

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);
});

关于node.js - NodeJS - 使用 Promise 对文件流进行哈希处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com