代码之家  ›  专栏  ›  技术社区  ›  li x

包装回调函数时承诺作为函数返回

  •  1
  • li x  · 技术社区  · 6 年前

    我正在尝试将加密库中现有的基于回调的函数转换为与es6一起使用 async/await 在上面的方法中。每当我打电话给 generateSubkey(password,salt) 它返回 [function] .如果我打电话进来 toString() 它显示了我的方法代码,而不是执行它。

    import crypto from 'crypto';
    import Promise from 'bluebird';
    
    async hashPassword(password) {
    
        try {
            // Create a salt with cryptographically secure method.
            let salt = await crypto.randomBytes(16);
    
            let subkey = await this.generateSubkey(password, salt);
    
            console.log(subkey);
    
        } catch (e) {
    
        }
    
    }
    
    generateSubkey(password, salt) {
        return new Promise.resolve((resolve, reject) => {
            return crypto.pbkdf2(password, salt, 10000, 32, 'sha256', (err, buffer) => {
                if (err) {
                    reject();
                }
                resolve(buffer);
            });
        })
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Bergi    6 年前

    每当我调用generateSubkey(密码,salt)时,它都会返回[函数]。

    要将promise构造函数与executor回调一起使用,需要 return new Promise(…) return new Promise.resolve(…)

    我正在尝试将加密库中现有的基于回调的函数转换为与ES8一起使用 async/await

    你可能在找 util.promisify .不需要带蓝鸟进来 1. 并使用 new Promise 构造函数。

    import crypto from 'crypto';
    import util from 'util';
    
    const pbkdf2Async = util.promisify(crypto.pbkdf2);
    function generateSubkey(password, salt) {
        return pbkdf2Async(password, salt, 10000, 32, 'sha256');
    }
    

    1: 如果你还想用蓝鸟,它确实会带来 a promisify function 以及:-)

        2
  •  2
  •   Martin Adámek    6 年前

    您正在通过调用 Promise.resolve 立即通过以下方式创建承诺:

    return new Promise((resolve, reject) => { ... });

    顺便说一句,你也可以用蓝鸟的 Promise.promisify (未测试):

    const promisePbkdf2 = Promise.promisify(crypto.pbkdf2);
    
    let subkey = await promisePbkdf2(password, salt, 10000, 32, 'sha256');
    

    在较新的节点中,还提供promisify支持(无bluebird):

    http://2ality.com/2017/05/util-promisify.html