【问题标题】:Promise returning as a function when wrapping callback function包装回调函数时承诺作为函数返回
【发布时间】:2018-04-12 12:16:49
【问题描述】:

我正在尝试将加密库中现有的基于回调的函数转换为在上面的方法中与 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);
        });
    })
}

【问题讨论】:

  • 您正在返回new Promise.resolve(),它会立即解决 Promise。解析值将是您的承诺功能。

标签: javascript ecmascript-6 promise es6-promise


【解决方案1】:

每当我调用 generateSubkey(password,salt) 时,它都会返回 [function]。

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

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

您可能正在寻找util.promisify。无需引入 Bluebird1 并使用 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:如果你仍然想使用 Bluebird,它确实会带来a promisify function :-)

【讨论】:

  • 现在这看起来更具吸引力,可以尝试一下,并希望废弃整个功能。
【解决方案2】:

您正在通过立即调用Promise.resolve 来解决新创建的承诺。以这种方式创建承诺:

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

顺便说一句,你也可以使用 bluebird 的 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

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2020-05-23
    • 2022-01-26
    相关资源
    最近更新 更多