nodejs异步到同步

Posted

技术标签:

【中文标题】nodejs异步到同步【英文标题】:nodejs asynchronous to synchronous 【发布时间】:2019-06-14 05:27:01 【问题描述】:

我是 nodejs 和 javascript 的新手,我目前正在从事一个开源项目,因为昨晚我试图将此函数从异步转换为同步,但我做不到,我使用了 async / await 但是我想我不是很了解这个概念,这个函数使用 aes256 算法加密和压缩文件,我异步工作得很好,但我想添加这个新功能,允许您递归加密目录的内容。

function encrypt( file, password , error_callback, succ_callback) 
    const initVect = crypto.randomBytes(16);

    // Generate a cipher key from the password.
    const CIPHER_KEY = crypto.createHash('sha256').update(password).digest();;
    const readStream = fs.createReadStream(file);
    const gzip = zlib.createGzip();
    const cipher = crypto.createCipheriv('aes-256-cbc', CIPHER_KEY, initVect);
    const appendInitVect = new AppendInitVect(initVect);
    // Create a write stream with a different file extension.
    const writeStream = fs.createWriteStream(path.join(file + ".dnc"));

    readStream
      .pipe(gzip)
      .pipe(cipher)
      .pipe(appendInitVect)
      .pipe(writeStream);

    readStream.on('error', error_callback);
    readStream.on('end', succ_callback);

【问题讨论】:

你到底要达到什么目标?你想用 async/await 语法写这个函数吗?或者你想改变功能? 对于您的项目,我建议您使用 Promises。 This 可能符合您的要求。 async/await 不能让事情同步运行。无论如何,忘记让你的函数同步的想法;而是坚持使用异步模式(可能涉及async/await)。 @MohammadGanji 我想写一个递归加密文件的函数,在加密过程完成后执行另一个函数。 【参考方案1】:

尝试使用承诺。通过稍微更改代码,您可以对函数进行承诺,然后等待所有承诺解决或拒绝,然后再采取行动。

function encrypt( file, password ) 
  const initVect = crypto.randomBytes(16);

// Generate a cipher key from the password.
  const CIPHER_KEY = crypto.createHash('sha256').update(password).digest();;
  const readStream = fs.createReadStream(file);
  const gzip = zlib.createGzip();
  const cipher = crypto.createCipheriv('aes-256-cbc', CIPHER_KEY, initVect);
  const appendInitVect = new AppendInitVect(initVect);
// Create a write stream with a different file extension.
  const writeStream = fs.createWriteStream(path.join(file + ".dnc"));

  readStream
    .pipe(gzip)
    .pipe(cipher)
    .pipe(appendInitVect)
    .pipe(writeStream);


  const promise = new Promise();
  writeStream.on('error', err => promise.reject(err));
  writeStream.on('end', data => promise.resolve(data));
  return promise;


const promise1 = encrypt(file1, password1);
const promise2 = encrypt(file2, password2);

Promise.all([promise1, promise2])
  .then(succ_callback)
  .catch(error_callback);

我尚未运行此代码,因此可能需要对其进行一些调整才能使其正常工作,但这是一般要点。

【讨论】:

【参考方案2】:

您不必同步加密文件,也可以异步加密。要遍历目录并获取其文件,请递归使用fs.readdir,直到找不到更多文件,然后您可以对找到的每个文件运行encrypt

【讨论】:

是的,我做到了,效果很好,但是我有一个日志记录功能,可以告诉我文件何时成功加密,我使用回调来加密单个文件,但在此功能中,记录器告诉我文件已完全加密,但仍在处理中(文件大小正在变化) PS:我用的是async/await,我认为logger不同步工作,所以调用了encrypt函数,记录“所有文件都加密了” @KRYPT0N 尝试从encrypt() 返回一个承诺,正如@Damo 在他的回答中所建议的那样。然后,您可以在登录 all files are encrypted 之前等待它。

以上是关于nodejs异步到同步的主要内容,如果未能解决你的问题,请参考以下文章

nodejs异步到同步

如何优雅的处理Nodejs中的异步回调

如何在nodejs中结合同步和异步功能

nodejs是同步还是异步

NodeJs, javascript: .forEach 似乎是异步的?需要同步

nodejs异步数据库功能需要同步回答