Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS-使用承诺散列文件流_Node.js_File_Stream_Promise_Es6 Promise - Fatal编程技术网

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.js
fs
模块中的常规函数,您可以使用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.js
fs
模块中的常规函数,您可以使用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上,因为加密是他们的选择。