对象承诺退货

时间:2019-09-01 03:00:22

标签: node.js object promise return

每当我尝试从crypto或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');
}

2 个答案:

答案 0 :(得分:1)

默认情况下,异步函数返回一个Promise。请在另一个异步函数中调用await createCode()或使用createCode()。then()

答案 1 :(得分:0)

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

因此,异步函数的调用者必须自己使用await(从另一个async函数内部)或使用.then()才能使价值超出承诺。

在我看来,您的任何一个功能都不会从异步中受益。 return await someFunc()返回someFunc()时,只需return someFunc()就可以完成承诺。 await完全没有必要。

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

因此,您可以使用此功能:

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

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

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

如果您想要异步版本并希望与promises一起使用,那么您将不得不承诺它:

// 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);
 });