2016-07-25 99 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

相關問題