javascript - 在 NodeJS 中需要一个异步函数

标签 javascript node.js asynchronous async-await

我正在努力了解 NodeJS 中的 async/await。

我在文件中有一个函数如下:

const getAccessToken = async () => {
  return new Promise((resolve, reject) => {

    const oauthOptions = {
      method: 'POST',
      url: oauthUrl,
      headers: {
        'Authorization': 'Basic ' + oauthToken
      },
      form: {
        grant_type: 'client_credentials'
      }
    };

    request(oauthOptions)
      .then((err, httpResponse, body) => {
        if (err) {
          return reject('ERROR : ' + err);
        }
        return resolve(body.access_token);
      })
      .catch((e) => {
        reject('getAccessToken ERROR : ' + e);
      });
  });
};

module.exports = getAccessToken;

此文件在 lib 文件夹中保存为 twitter.js

在我的 index.js 文件中,我有以下内容:

const getAccessToken = require('./lib/twitter');

let accessToken;

try {
  accessToken = await getAccessToken();
} catch (e) {
  return console.log(e);
}

console.log(accessToken);

我在尝试运行此代码时遇到错误:

>   accessKey = await getAccessToken();
>                     ^^^^^^^^^^^^^^
> 
> SyntaxError: Unexpected identifier
>     at createScript (vm.js:74:10)
>     at Object.runInThisContext (vm.js:116:10)
>     at Module._compile (module.js:533:28)
>     at Object.Module._extensions..js (module.js:580:10)
>     at Module.load (module.js:503:32)
>     at tryModuleLoad (module.js:466:12)
>     at Function.Module._load (module.js:458:3)
>     at Function.Module.runMain (module.js:605:10)
>     at startup (bootstrap_node.js:158:16)
>     at bootstrap_node.js:575:3

我可以不 await 标记为 async 的所需函数吗?

最佳答案

您的代码已经正确。在 twitter.js无需更改任何内容,您有两种选择来使用它:

  1. 标有async 的函数总是返回 promise 。因此你可以简单地做:

    const getAccessToken = require('./lib/twitter');
    
    getAccessToken().then(accessToken => {
        console.log(accessToken);
    })
    
  2. 所有返回 promises 的函数都可以被 awaited,但您不能在 async 标记的函数之外使用 await。所以你也可以这样做:

    const getAccessToken = require('./lib/twitter');
    
    (async function () {
        var accessToken = await getAccessToken();
        console.log(accessToken);
    })();
    

async/await 关键字不会改变异步函数的行为方式。您仍然无法同步等待异步函数,您只能在异步函数内执行此操作。 Async/await 只是 promises 之上的语法糖。

关于javascript - 在 NodeJS 中需要一个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45053974/

相关文章:

node.js - HTTP 请求 node.js 使用 mikeal 的 'request'

Java AWT drawImage 竞争条件 - 如何使用同步来避免它

javascript - 我可以将本地 var 设置为 'this' 以在匿名回调函数中引用它吗?

javascript - 在客户端 PC 上启动 MS Word 以编辑服务器上的文档

javascript - Jquery 未获取最新输入值

javascript - jQuery 回调触发得太早

c# - 为什么这些异步 RIA 服务调用在 Web 服务器上串行执行?

javascript - 如何确定在 javascript 或 jquery 中触发事件处理程序的顺序?

node.js - 将旧的 1.2 meteor 项目升级到最新版本 1.6 的最佳方法是什么?

node.js - 云函数: TypeError: Cannot read property 'auth' of undefined