settimeout中的异步函数在时间之前调用

时间:2017-09-28 03:07:25

标签: javascript node.js asynchronous settimeout

我在这里有这个函数,它按间隔运行,它的作用是什么,当它运行时,它设置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);

不确定为什么会这样。也许我正在以错误的方式去做。 任何人都可以对此有所了解吗?感谢

2 个答案:

答案 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