【问题标题】:object Promise on return对象承诺返回
【发布时间】:2020-01-04 15:53:28
【问题描述】:

每当我尝试从加密或 nanoid(新库)生成随机密钥时,它只会返回 [object Promise]

async function createCode(length){
  if(!length){
    return nanoid;
  } else {
    return nanoid(length);
  }
}

// another one for example
async function createCode(){
  return await crypto.randomBytes(64).toString('hex');
}

【问题讨论】:

    标签: node.js object promise return


    【解决方案1】:

    所有异步函数都返回一个承诺。总是。

    因此,异步函数的调用者必须自己使用await(在另一个async 函数中)或使用.then() 来从promise 中获取值。

    在我看来,您的任何一个函数都不会从异步中受益。 return await someFunc()someFunc() 返回一个promise 时可以用return someFunc() 来完成同样的事情。 await 根本不需要。

    仅供参考,如果您想要异步版本,crypto.randomBytes() 使用回调。如果你不向它传递回调,那么它只是一个普通的同步函数。除非您已经做了一些事情来制作该库的承诺版本,否则它不会返回承诺。

    所以,你可以用这个:

    // another one for example
    function createCode(){
      return crypto.randomBytes(64).toString('hex');
    }
    

    您可以将其作为常规函数调用:

    let randomVal = createCode();
    console.log(randomVal);
    

    如果您想要异步版本并希望将其与 Promise 一起使用,那么您必须对其进行 Promisify:

    // another one for example
    function createCode(){
      return new Promise((resolve, reject) => {
           crypto.randomBytes(64, function(err, val) {
               if (err) return reject(err);
               resolve(val.toString('hex'));
           });
      });
    
    }
    

    然后,你可以调用它:

     createCode().then(val => {
         console.log(val);
     }).catch(err => {
         console.log(err);
     });
    

    【讨论】:

      【解决方案2】:

      异步函数默认返回一个承诺。请在另一个异步函数中调用 await createCode() 或使用 createCode().then()

      【讨论】:

        猜你喜欢
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-03
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多