我正在使用Promises来同步我的节点应用程序中的散列函数:
var example_int = '1000121';
function MakeRequest(value){
var hash_result = RequestHash(example_int);
hash_result.then(function(v){
//Do stuff with v...
})
}
function RequestHash(value){
return(Hash(value))
}
function Hash(value){
var HashPromise = new Promise(function(resolve, reject){
var crypto = require('crypto');
var hash = crypto.createHash('md5');
hash.on('readable', () => {
var data = hash.read();
if(data){
var output = data.toString('hex');
resolve(output);
}
})
hash.write(value);
hash.end();
})
return(HashPromise);
}
MakeRequest();
但是,我希望能够从外部 Promise函数中访问生成的哈希值。我最初的方法是使用重新分配:
var example_int = '1000121';
function MakeRequest(value){
var hash_result = RequestHash(example_int);
//Hash output assigned to example_int....
}
function RequestHash(value){
return(Hash(value))
}
function Hash(value){
var HashPromise = new Promise(function(resolve, reject){
var crypto = require('crypto');
var hash = crypto.createHash('md5');
hash.on('readable', () => {
var data = hash.read();
if(data){
var output = data.toString('hex');
example_int = output; //Re-assignment...
resolve(output);
}
})
hash.write(value);
hash.end();
})
return(HashPromise);
}
MakeRequest();
在不依赖重新分配的情况下,是否有更安全的方式和/或更有效的方法来执行此操作?
答案 0 :(得分:3)
hash API在node.js中不是异步的,因此不需要以promises开头。
代码简单如下:
var crypto = require('crypto');
var exampleValue = '1000121';
var md5Val = crypto.createHash('md5').update(exampleValue).digest('hex');
// -> '4f0b7e8fcb0cfcfce1c77e39864e7ca4'
这项工作做得很好。如果需要,请将其包装在函数中。
如果您的真正问题涉及异步部分,那么您需要提出更详细的问题。
答案 1 :(得分:2)
我最近在Eric Elliot阅读了很多内容。他强烈建议的范例之一是实现"pure functions"(意味着不依赖于共享可变状态的函数,例如example_int重新赋值方法)。
我同意@Tomalak关于Hash API的同步特性及其建议(但使用您提供的代码)。
我想在实施方面回答你的问题。这可能不完美,但我想尝试回答这个问题(欢迎来自其他人的任何反馈)。模块化此代码以进行多种配置,并使用generate
/ MakeRequest
方法返回承诺。然后,您可以根据需要从您的消费应用程序代码中执行此操作(这也简化了您的测试方法,因为您没有检查共享状态值,而是......只是I / O.
// hasher.js
const crypto = require('crypto');
const Hasher = module.exports = function Hasher(algorithm = 'md5',digest = 'hex', ...opts) {
this.digest = options.digest || 'hex';
this.algorithm = options.algorithm || 'md5';
// For other hashing algorithms, spread `opts` and assign to instance properties
};
// Will need improvements or abstraction to support other hashing algorithms
// The below code is synchronous, and does not "need" to use Promises, but is being used to try and answer the original question.
Hasher.prototype.generate = (data) => {
return new Promise((resolve, reject) => {
if(!data) reject(new Error('Hasher.generate() requires `data` parameter'));
resolve(crypto([this.algorithm]).update(data).digest(this.digest));
});
};
// app.js
const Hasher = require('./hasher.js'); // Create new hashers as needed
const md5Hasher = new Hasher(); // defaults to MD5 w/ hex digest
let someData = 12345;
md5Hasher(someData)
.then((hashedData) => {
someData = hashedData;
})
.catch(e) {
console.error(e);
throw e;
};