Node.js 异步-使用Twitter API等待问题

Node.js 异步-使用Twitter API等待问题,node.js,twitter,async-await,Node.js,Twitter,Async Await,我目前正在尝试将API与Twitter API结合使用 我使用Twit包连接到twitters API,但当我尝试执行get请求时 承诺{待定} 我尝试过使用Async Await,但我不确定我在这里做错了什么 这是我的密码: const Twit = require('twit'); const twitterAPI = require('../secrets'); //Twit uses OAuth to stablish connection with twitter let T =

我目前正在尝试将API与Twitter API结合使用

我使用Twit包连接到twitters API,但当我尝试执行get请求时

承诺{待定}

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

从代码中可以看出,getUserTweets是一个异步函数,因此它最终将返回一个承诺。我假设您将在另一个函数上使用此值,因此您需要在异步函数中使用它并使用wait,否则您将始终得到承诺

const logTweets = async (username) => {
  try {
    const userTweets = await getUsersTweets(username);
    // Do something with the tweets
    console.log(userTweets);
  catch (err) {
    // catch any error
    console.log(err);
  }
}
如果日志记录是您所需要的,并且您将其包装在一个函数中,在该函数中您可以使用console.log进行记录,那么您可以直接调用该函数:

logTweets('someUsername');
问题

示例代码中错误的最大假设是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
})
作为T.get函数调用中的最后一个参数提供的回调函数不必在“await”之前

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

理由

这里需要注意的是,async/await与承诺返回函数一起工作得很好,这些函数最终会用预期的数据得到解决,然而,这里并不能保证这一点

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

解决方案

最好的解决方案是确保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();