【问题标题】:Console.log showing up at the end of the functionConsole.log 显示在函数末尾
【发布时间】:2019-07-11 17:17:38
【问题描述】:

我正在尝试使用 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:文字

...

我很确定问题很容易发现,但我不知道该怎么做。我希望我足够清楚,并且我的信息不会犯太多错误。

【问题讨论】:

  • 你在这里使用await和回调:/为什么?
  • 事实上,我很确定我忘记删除它们了。但是即使没有awaitasync,问题还是一样
  • stackoverflow.com/questions/44512388/… - 如果您想了解更多关于 async 和 await 用法的信息,这是一个很好的主题,这里提供了一些示例,您可能会觉得有用。
  • 谢谢,我会看这个帖子
  • @EmpireDémocratiqueduPoulpe 问题本身与 Promises 或 async / await 无关 - 这是一个非常常见的closure problem

标签: javascript node.js


【解决方案1】:

await 仅适用于 Promises,不适用于回调函数。 await 等待 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2015-09-14
    相关资源
    最近更新 更多