node.js - 使用 Twitter API 的异步 - Await 问题

标签 node.js twitter async-await

我目前正在尝试通过 Twitter API 练习使用 API。

我正在使用 Twit 包连接到 Twitter API,但是当我尝试执行 get 请求时,我得到了

Promise { pending }

我尝试过使用 Async-Await,但我不确定我在这里做错了什么。

这是我的代码:

const Twit = require('twit');
const twitterAPI = require('../secrets');


//Twit uses OAuth to stablish connection with twitter
let T = new Twit({
    consumer_key: twitterAPI.apiKey,
    consumer_secret: twitterAPI.apiSecretKey,
    access_token: twitterAPI.accessToken,
    access_token_secret: twitterAPI.accessTokenSecret
})

const getUsersTweets = async (userName) => {
    let params = { screen_name: userName, count: 1 }
    const userTweets = await T.get('search/tweets', params, await function (err, data, response) {
        if (err) {
            return 'There was an Error', err.stack
        }
        return data
    })
    return userTweets
}

console.log(getUsersTweets('Rainbow6Game'));

最佳答案

问题

示例代码中最大的错误假设是 T.get 预计最终会解析一些数据。

const userTweets = await T.get('search/tweets', params, await function (err, data, response) {
    if (err) {
        return 'There was an Error', err.stack
    }
    return data // 'data' returned from here is not necessarily going to be received in 'userTweets' variable
})
  1. 作为 T.get 函数调用中最后一个参数提供的回调函数不必以“await”开头。

  2. 从回调函数返回的“数据”不一定会在“userTweets”变量中接收。这完全取决于T.get如何实现并且无法控制。

原因

这里需要注意的是,async/await 与 Promise 返回函数配合得很好,这些函数最终得到预期数据的解析,但是,这里不能保证这一点

依赖异步 T.get 函数调用的结果可能不起作用,因为它会立即返回 Promise {ending } 对象,并且在没有数据的情况下得到解析。最好的情况是,您的函数的所有功能都可以正常工作,但 getUsersTweets 函数将返回“未定义”。

解决方案

最好的解决方案是确保您的 getUsersTweets 函数返回一个 promise ,最终用正确的数据得到解决。建议进行以下更改:

const getUsersTweets = (userName) => {
  return new Promise ((resolve, reject) => {
    let params = { screen_name: userName, count: 1 }
    T.get('search/tweets', params, function (err, data, response) {
      if (err) {
        reject(err);
      }
      resolve(data);
    })
  }
}

以上函数现在保证返回预期数据,并且可以按以下方式使用:

const printTweets = async () => {
  const tweets = await getUsersTweet(userName);
  console.log(tweets);
}

printTweets();

关于node.js - 使用 Twitter API 的异步 - Await 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62648178/

相关文章:

node.js - CodeceptJS 在 Ubuntu 上的安装问题

javascript - 如何使用 ntwitter 停止和重新启动 Twitter 流

jquery - 在 HTML 中找到 Twitter 句柄,然后创建链接

c# - .ContinueWith() 的竞争条件

c# - PostAsync 后未收到响应

c# - 单元测试时,如何从异步方法模拟返回 null?

mongodb - (Node.js/Express.js) 错误 : Schema hasn't been registered for model "document"

javascript - 在 Jest 中测试事件监听器的最简单方法是什么?

node.js - 从 Artifactory 安装 scoped npm 包

php - Twitter 请求 - 正确的方式