Node.js 异步-使用Twitter API等待问题
我目前正在尝试将API与Twitter API结合使用 我使用Twit包连接到twitters API,但当我尝试执行get请求时 承诺{待定} 我尝试过使用Async Await,但我不确定我在这里做错了什么 这是我的密码: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 =
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();