我正在尝试使用JavaScript和Node.JS制作一个小型Twitter机器人。但是,在功能上,我的所有console.log都显示在最后。
我尝试使用异步,回调和经典函数,但始终获得相同的输出。
getTweets: function(Twitter, callback) {
Twitter.get(`search/tweets`, this.parameters, callback);
},
likeTweet: function(Twitter, tweetid, callback) {
Twitter.post(`favorites/create`, { id:tweetid }, callback);
},
execute: function(Twitter) {
let count = 0;
let done = 0;
this.getTweets(Twitter, (err, tweets) => {
for (thetweet of tweets.statuses) {
if (typeof thetweet === `undefined`) {
continue;
}
count++;
this.likeTweet(Twitter, thetweet.id_str, (err, reponse) => {
if (err) {
switch (err.code) {
case 139: console.log(`Tweet ${count}:`.bold.yellow + ` Le tweet a déjà été aimé par le bot.`); break;
default: console.log(`Tweet ${count}:`.bold.red + ` Erreur inconnue => ${err}`); break;
}
} else {
console.log(`Tweet ${count}:`.bold.green + ` Tweet aimé`);
done++;
}
});
}
});
}
在调用 execute()之前,我有一个 console.log(1)。 execute()之后,还有另一个 console.log(3)。在 execute()中,有显示文本的 console.log()。 (是的,我知道,有很多console.log)
我想要那个:
1
推文1:文字
推文2:文字
推文3:文字
...
3
但是,当我运行bot.js时,我得到了:
1
3
推文15:文字
推文15:文字
推文15:文字
...
我很确定问题很容易发现,但是我不知道该怎么办。我希望我已经很清楚了,我的消息也不会犯很多错误。
答案 0 :(得分:0)
await仅适用于Promises,不适用于回调函数。等待等待Promise完成。
您可以使用任何Promise库将Twitter回调函数设置为promise并对其使用await。我更喜欢蓝鸟。
import {Promise} from 'bluebird'
import {Twitter} from 'twitter'
Promise.promisifyAll(Twitter);
现在,您可以使用await并使它看起来像同步代码。
let tweets = await Twitter.get(`search/tweets`,parameters);