操纵外部Promise结构的价值?

时间:2016-11-23 17:44:54

标签: javascript node.js promise

我正在使用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();

在不依赖重新分配的情况下,是否有更安全的方式和/或更有效的方法来执行此操作?

2 个答案:

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