nodejs异步到同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs异步到同步相关的知识,希望对你有一定的参考价值。
我是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);
}
答案
尝试使用promises。通过稍微更改代码,您可以宣传该功能,然后在采取行动之前等待所有承诺解决或拒绝。
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);
我没有运行此代码,因此可能需要进行一些调整以使其工作,但这是一般要点。
另一答案
您不必同步加密文件,也可以异步加密。要遍历目录并获取其文件,请递归使用fs.readdir
,直到找不到更多文件,然后就可以在找到的每个文件上运行encrypt
。
以上是关于nodejs异步到同步的主要内容,如果未能解决你的问题,请参考以下文章