【发布时间】:2021-06-03 06:45:18
【问题描述】:
我正在向 Twitter API 发出一些请求,为了检索推文,我需要执行一些递归方法调用,因为每个请求最多只能返回 100 条推文。
所以这个过程很简单。
- 调用函数并等待它
- 执行 http 请求,等待
- 如果响应的元数据包含
next_token,则缓存结果并使用下一个令牌执行另一个 http 请求。 - 重复直到
next_token未定义,此时使用所有推文列表解决承诺。
然而这并没有按预期工作,递归 http 工作,但是当递归函数的 else 块满足并且 promise 被解决时,什么也没有发生。执行不会回到第一个函数。一切似乎都在旋转,什么也不做。我在每一行都添加了断点,但没有任何东西会触发断点。
我哪里错了?
public async getTweetList(ticker: string): Promise<string[]>{
let tweets: string[] = [];
tweets = await this.getAllTweetsRecursively(ticker, null, tweets);
return tweets;
}
public async getAllTweetsRecursively(ticker: string, nextToken: string, tweetList: string[]): Promise<string[]>{
return new Promise(async (resolve, reject) => {
let query = `?query=(${ticker})`
query += this.extraQuery;
if(nextToken){
query += this.nextTokenQuery + nextToken
}
let res = await axios.default.get(this.url + query, {
headers: this.headers
})
let newNextToken = res.data.meta.next_token;
if(res.data.data.length > 0 && newNextToken){
res.data.data.forEach(tweet => {
tweetList.push(tweet.text);
})
this.getAllTweetsRecursively(ticker, newNextToken, tweetList);
}
else {
resolve(cleanedTweets)
}
})
}
替代实现 - 相同问题
public async getTweetList(ticker: string): Promise<string[]>{
return new Promise(async (resolve) => {
let tweets: string[] = [];
tweets = await this.getAllTweetsRecursively(ticker, null, tweets);
resolve(tweets);
})
}
public async getAllTweetsRecursively(ticker: string, nextToken: string, tweetList: string[]): Promise<string[]>{
return new Promise(async (resolve, reject) => {
let query = `?query=(${ticker})`
query += this.extraQuery;
if(nextToken){
query += this.nextTokenQuery + nextToken
}
let res = await axios.default.get(this.url + query, {
headers: this.headers
})
let newNextToken = res.data.meta.next_token;
if(res.data.data.length > 0 && newNextToken){
res.data.data.forEach(tweet => {
tweetList.push(tweet.text);
})
await this.getAllTweetsRecursively(ticker, newNextToken, tweetList);
}
else {
let cleanedTweets: string[] = [];
tweetList.forEach(tweet => {
if(tweet.startsWith("RT")){
return;
}
if(!tweet.toLowerCase().includes("$" + ticker)){
return;
}
cleanedTweets.push(tweet);
});
resolve(cleanedTweets)
}
})
}
【问题讨论】:
-
随意观察是只有最终的承诺解决了,其他的只是结束。但是我对手动创建的承诺链接在一起有点不稳定。
-
你不应该也
await打电话给this.getAllTweetsRecursively(ticker, newNextToken, tweetList);吗? -
@thedude 我已经根据您的建议添加了一个新的实现。问题依然存在
-
@tmdesign 见上文
-
要么将函数标记为
async,然后返回正常值,要么将其设为常规函数并返回 Promise。不要两者都做:async函数已经将结果包装为一个promose,所以你的async function(...) { return new Promise(...) }返回一个promise,它解析为promise,而不是解析为实际数据。
标签: javascript typescript asynchronous promise