【问题标题】:using async and await in nodejs getting Promise { <pending> }在 nodejs 中使用 async 和 await 获得 Promise { <pending> }
【发布时间】:2018-03-14 08:32:53
【问题描述】:

在我的情况下,我能够获得令牌,但不是我想要的方式,即我不想打印未决的承诺,我在 tokenDisp.js 中运行后的输出是:

output: Promise { pending }

 t5Npxk5FfnRTj8iHd8vyyfGxnhXR4KQf

login.js:

  module.exports = async function doLogin() {
  const token = await loginToken();
  const myToken = JSON.parse(token);
  return console.log(myToken);
};

tokenDisp.js:

 const myToken = require('./login.js);
 myToken();

有人可以帮忙吗?

【问题讨论】:

  • 是的,async 函数保证返回一个 Promise ... 所以,按预期使用 promises .then 方法 - 注意,您的 doLogin 函数将返回一个 Promise,该 Promise 将始终解析为 @987654326 @,当然
  • myToken() 返回一个承诺。这有什么问题吗?
  • myToken() return promise 带有令牌,但我只想要令牌
  • 然后,使用 .then 就像你对任何其他承诺一样 - 这里有一些 documentation on how to use Promises (如果你不知道,async/await 是承诺的语法糖,所以承诺就是你需要学会使用)
  • 如果我使用.then,我需要将函数导出到另一个文件中并使用它,可以吗?

标签: javascript node.js async-await


【解决方案1】:

所有async 函数都返回一个promise,您仍然必须在async 函数的返回值上使用.then() 或await 才能使用它。如果您从 async 函数返回一个值,它将是返回的承诺的解析值。如果你抛出一个异常,这个异常将是拒绝返回的 Promise 的原因。

在函数内部使用await 在异步函数内部是一种方便。它不会神奇地将异步操作变成同步操作。因此,您的函数返回一个承诺。要从中获得价值,请在其上使用.then()。

module.exports = async function doLogin() {
  const token = await loginToken();
  const myToken = JSON.parse(token);
  console.log(myToken);
  return myToken;    // this will be resolved value of returned promise
};

const myToken = require('./login.js);
myToken().then(token => {
    // got token here
}).catch(err => {
    console.log(err);
});

注意:您的 login.js 模块产生的结果与这样编写的结果相同(不使用 async 或 await):

module.exports = function doLogin() {
  return loginToken().then(token => {
      const myToken = JSON.parse(token);
      console.log(myToken);
      return myToken;    // this will be resolved value of returned promise
  });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多