node.js - 异步 - 使用 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'));
解决方案
问题
示例代码错误的最大假设是 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 函数调用中作为最后一个参数提供的回调函数不必在前面加上“等待”。
从回调函数返回的“数据”不一定会在“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();
推荐阅读
- ruby-on-rails - 如何使用哈希语法访问 ruby 对象的方法?
- sharepoint - 在 SharePoint 库中按名称对文件进行分组
- c - 使用 scanf 和无字符串库函数的 C 回文
- python - 如何修复我在验证步骤中使用的代码?
- firebase - 如何修复 Xamarin 和 Firebase 中的“com.google.firebase.messaging 包不存在”错误
- amazon-web-services - 无法检索 EC2 实例的默认 Windows 管理员密码
- javascript - 反应原生返回图像功能
- python - 如何在 Django 或 python 中将字符串转换为对象?
- java - 如何检测用户何时真正选择了 ComboBox 的菜单项?
- php - 如何获取对象而不是数组,例如 FETCH_OBJECT 而不是 FETCH_ASSOC