首页 > 解决方案 > 异步 - 使用 Twitter API 等待问题

问题描述

我目前正在尝试将 API 与 Twitter API 一起使用。

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

承诺{待定}

我曾尝试使用 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'));

标签: node.jstwitterasync-await

解决方案


问题

示例代码错误的最大假设是 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 函数调用中作为最后一个参数提供的回调函数不必在前面加上“等待”。

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

原因

这里要注意的是 async / await 可以很好地与 Promise 返回函数一起使用,最终得到预期的数据,但是,这里不能保证

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

解决方案

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

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();

推荐阅读