为什么我的一些代码在其他代码之前运行?

时间:2016-07-25 23:20:45

标签: javascript node.js

所以我正在运行我的脚本,我想知道为什么我的一些代码在彼此之前运行。

例如,我有一个函数,我最后调用它,后面应该显示一条消息。但是它首先运行了该函数,然后显示了该消息。

另外,我注意到显示消息,每次都会以随机顺序显示。 (Wierd Huh。)

我设法通过制作一堆.this来解决其中一些问题,但我不希望将来这么做,因为它会使代码变得非常混乱。

以下是我发现的一些代码片段:

else if (input.startsWith('CALL')) {

//First
    bot.sendMessage(message, ':arrow_right: Private Messaging You To Decrease Spam :arrow_left:');
//Second
    bot.sendMessage(user.id, ':rotating_light: This feature is experimental. You may experience bugs/glitches when using it. :rotating_light: \n').then(() => getUser()); // << Third
    var senderId = message.sender.id; // << Fourth

    function getUser() {
        try {
            var userList = []
            for (var user of bot.users) {
                if (user.status == "online" && user.bot == false) {
                    userList.push(user)
                }
            }

            bot.sendMessage(senderId, ':telephone: :arrow_right: Users Found That Meet Search Criteria: ' + userList.length + ' out of ' + bot.users.length + '.'); //Fifth
            bot.sendMessage(message, ':telephone: :arrow_right: User Found: ' + userList[Math.floor(Math.random() * userList.length)]); //Sixth

        } catch (err) {
            bot.sendMessage(message, err)
        }
        console.log(userList);
        console.log(userList.length);
    }

}

代码有效,它只是我担心的顺序。

提前感谢您的帮助:)

编辑:我添加了评论,说明订单应该是什么。

编辑#2:澄清问题:我想知道如何能够以特定顺序运行代码。并在先运行之前等待代码。

2 个答案:

答案 0 :(得分:1)

我假设bot.sendMessage向某个其他系统发出某种类型的网络请求,而您正在观察的问题是这些网络请求似乎以不可预测的顺序生效。这是有道理的,因为你不会在开始下一个请求之前等待一个请求完成。

想象一下,您打开了一个Web浏览器,同时向两个不同的URL打开了两个选项卡。首先加载哪个页面?这基本上就是你的代码所做的事情。

因为我在一个地方看到了.then,所以我将进一步假设bot.sendMessage返回一个承诺。所以继续使用承诺等待第一个请求完成,然后再开始下一个请求。

具体来说,改变一下:

bot.sendMessage(senderId, ':telephone: :arrow_right: Users Found That Meet Search Criteria: ' + userList.length + ' out of ' + bot.users.length + '.');
bot.sendMessage(message, ':telephone: :arrow_right: User Found: ' + userList[Math.floor(Math.random() * userList.length)]);

到此:

bot.sendMessage(senderId, ':telephone: :arrow_right: Users Found That Meet Search Criteria: ' + userList.length + ' out of ' + bot.users.length + '.').then(() => {
    bot.sendMessage(message, ':telephone: :arrow_right: User Found: ' + userList[Math.floor(Math.random() * userList.length)]);
});

(与您希望以特定顺序发生的其他消息相同。)

答案 1 :(得分:0)

用于发送消息的函数是异步运行的,因此在调用下一个调用(以及其余代码)之前必须等待第一个调用的结束。 smarx为你提供了一个很好的例子。