2016-07-25 79 views
-1

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

例如,我有一个函数,我最后调用它,之后应该显示一条消息。但相反,它首先运行该功能,然后显示该消息。

此外,我注意到显示消息,它会显示在随机顺序每次。 (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:澄清问题:我想知道如何能够使代码以特定顺序运行。在运行之前先等待代码。

回答

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)]); 
}); 

(同上与您要按照一定的顺序发生的其他消息。)

+0

我相信你的问题是正确的。他的问题并不十分清楚,但是,这几乎是告诉我们他得到承诺的唯一线索。 –

+0

啊,所以我不得不添加。然后是所有的代码,我希望我不需要那样做。谢谢你:) – TrueXPixels

+0

@TrueXPixels'.then',而不是'.this'。 – smarx

0

功能你用来发送消息异步运行,所以你必须等待第一次调用结束之前调用下一个(和其他代码)。 smarx给你一个很好的例子,说明该怎么做。

+0

嗨,何塞,欢迎来到SO。解释一下*如何*等待第一次通话结束将有利于OP,并会增加您选择答案的可能性。如果另一个答案已经提供了一个很好的例子,或者如果另一个答案只是需要澄清一点,请考虑增加投票和/或写评论。 – Will

相关问题