2017-09-28 1 views
-1

Eh bien j'ai cette fonction ici qui fonctionne sur des intervalles et ce qu'il fait est, quand il fonctionne, il définit 2 settimeout.fonction asynchrone settimeout appelé avant le temps

est ici le problème, une fonction asynchrone qui doit être appelée après la 2ème temps est appelé avant que le délai d'attente est 2ème même déclenché. C'est mon code.

var runner = Interval.run(function() { 
    //-212965881 
    bot.sendMessage('-212965881', "Drop usernames now").then(function(){ 
     ready = 1; 
     list = {}; 
     console.log(ready); 
     setTimeout(function(){ 
      return bot.sendMessage('-212965881',"Round has begun. Please start liking now. Leech check will begin in 1 minute"); 
     }, 10000); 
    }).then(function(){ 
     ready = 0; 
     setTimeout(function(){ 
      return bot.sendMessage('-212965881',"Leech check has begun!"); 
     }, 15000); 
    }).then(function(){ 
     //This one fires before 15 seconds 
     let msg = {chat:{}}; 
     msg.chat.id = '-212965881'; 
     return bot.event('/check', msg); 
    }).catch(function(err){ 
     console.log(err); 
    }); 
}, 20000); 

Vous ne savez pas pourquoi cela se produit. Peut-être que j'y vais de la mauvaise façon. Quelqu'un peut-il jeter un peu de lumière là-dessus? Merci

+0

Possible duplicata de [Comment renvoyer la réponse d'un appel asynchrone?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous- call) –

+2

'setTimeout()' planifie quelque chose de fonctionner asynchrone plus tard, il ne met pas en pause l'exécution. La valeur de retour de n'importe quelle fonction que vous passez à 'setTimeout()' est également ignorée. – nnnnnn

Répondre

0

Cela se produit parce que le code dans vos then gestionnaires créent du code asynchrone non retourné, ou fondamentalement « sortir » de la chaîne de promesse sans en aviser la chaîne Promesse des activités.

Vous devez envelopper votre setTimeout à l'intérieur d'un constructeur Promise puis également vous assurer que vous attendez l'intérieur bot.sendMessage invocations pour terminer par les résoudre dans votre nouvelle Promises

changement à utiliser les constructeurs Promise, voir Resolving a Promise

Car les fonctions asynchrones que vous essayiez d'invoquer sont renvoyées quelques secondes plus tard.
var runner = Interval.run(function() { 
    //-212965881 
    bot.sendMessage('-212965881', "Drop usernames now").then(function(){ 
     ready = 1; 
     list = {}; 
     console.log(ready); 
     return new Promise((resolve) { 
      setTimeout(function(){ 
       resolve(bot.sendMessage('-212965881',"Round has begun. Please start liking now. Leech check will begin in 1 minute")) 
      }, 10000); 
     }); 
    }).then(function(){ 
     ready = 0; 
     return new Promise((resolve) { 
      setTimeout(function(){ 
       resolve(bot.sendMessage('-212965881',"Leech check has begun!")) 
      }, 15000); 
     }); 
    }).then(function(){ 
     //This one fires before 15 seconds 
     let msg = {chat:{}}; 
     msg.chat.id = '-212965881'; 
     return bot.event('/check', msg); 
    }).catch(function(err){ 
     console.log(err); 
    }); 
}, 20000); 
0

Les trois .then que vous avez écrit fonctionnent sur le premier Promise de façon répétée.

vous pouvez utiliser le module co ou ES6 async/await pour contrôler plusieurs Promise.