如何使用setInterval在for循环中按顺序调用函数

时间:2018-03-30 06:21:27

标签: javascript node.js for-loop

我想顺序执行for循环中的函数。

我使用node.js,我的代码是......

var insertData = [];
var interval = 500;

function working1(nodeID, keyword, cb){
    insertData.push(nodeID);
    console.log('working: '+nodeID);
    // get data and add value to insertData 
}

function working2()
{
  // insert insertData to database
}

function getDeviceValue(nodeID){
    insertData.push(nodeID);
    console.log('getDeviceValue : '+nodeID);
    async.series([
            function(calllback){
                   working1(nodeID, 'A', function(data, err){
                           if (err) console.log(err);
                           else calllback(null, data);
                           });
            },
            function(calllback){
                   working1(nodeID, 'B', function(data, err){
                            if (err) console.log(err);
                            else calllback(null, data);
                            });
            },
    ], function(err, results){
          working2();
    });
}

setInterval(function() { // This should work periodically.
    dbData = [];
    for (var i=1; i<=4; i++)
        getDeviceValue('0000'+i);
}, interval);

当我执行上面的代码时,它的工作方式就像......

getDeviceValue : 00001
getDeviceValue : 00002
getDeviceValue : 00003
getDeviceValue : 00004
working : 00001
working : 00002
working : 00003
working : 00004

但我想让它像...一样工作。

getDeviceValue : 00001
working : 00001
getDeviceValue : 00002
working : 00002
getDeviceValue : 00003
working : 00003
getDeviceValue : 00004
working : 00004

当我搜索它时,答案是&#39;使用promise&#39;。

我该如何使用它?

还有其他办法吗?

2 个答案:

答案 0 :(得分:0)

没有承诺的解决方案,使用简单的javascript。

&#13;
&#13;
var i = 1;
var interval = 500;
var insertData = [];

function working(nodeID){
    insertData.push(nodeID);
    console.log('working: '+nodeID);
}
function getDeviceValue(nodeID){
    insertData.push(nodeID);
    console.log('getDeviceValue : '+nodeID);
    working(nodeID);// Changed
}

function asyncLoop(index) 
{
    if(index > 4) return;
       setTimeout(function() {

       getDeviceValue('0000'+index);
       index++;
       asyncLoop(index);
    }, interval);
}



asyncLoop(i);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以将第一个console.log放在async.series内:

function getDeviceValue(nodeID){
    insertData.push(nodeID);
    async.series([
        function(callback) {
            console.log('getDeviceValue : '+nodeID);
            callback();
        },
        function(calllback){
               working1(nodeID, 'A', function(data, err){
                       if (err) console.log(err);
                       else calllback(null, data);
                       });
        },
        function(calllback){
               working1(nodeID, 'B', function(data, err){
                        if (err) console.log(err);
                        else calllback(null, data);
                        });
        },
    ], function(err, results){
        working2();
    });
}