我在这里有这个函数,它按间隔运行,它的作用是什么,当它运行时,它设置2个settimeout。
这就是问题所在,在第二次超时被触发之前调用第二次超时之后应调用的异步函数。这是我的代码。
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);
不确定为什么会这样。也许我正在以错误的方式去做。 任何人都可以对此有所了解吗?感谢
答案 0 :(得分:0)
这是因为then
处理程序中的代码正在创建未返回的异步代码,或基本上“突破”Promise链而不通知Promise链的活动。
您需要将setTimeout
包装在Promise构造函数中,然后确保等待内部bot.sendMessage
调用通过在新Promises
将其更改为使用Promise构造函数,请参阅Resolving a Promise
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);
答案 1 :(得分:0)
因为几秒钟后会返回您尝试调用的异步函数。您编写的三个.then
在第一个Promise
上重复工作。
您可以使用co
模块或ES6 async/await
来控制多个Promise
。