Node.js 如何一次调用一个节点循环中的函数

Node.js 如何一次调用一个节点循环中的函数,node.js,loops,asynchronous,settimeout,sequential,Node.js,Loops,Asynchronous,Settimeout,Sequential,这个代码块首先处理else块,然后是if块,对于所有请求,我需要一个执行5次迭代并停止15秒的代码。然后再次从接下来的5次迭代开始,依此类推 function passotken(token, callback) { async.waterfall([ function(callback) { db.executesql("select top 20 ext_id as EMPNUM , data as datae from newtable", function (data, err)

这个代码块首先处理else块,然后是if块,对于所有请求,我需要一个执行5次迭代并停止15秒的代码。然后再次从接下来的5次迭代开始,依此类推

function passotken(token, callback) {


async.waterfall([
function(callback) {
db.executesql("select top 20 ext_id as EMPNUM ,  data as datae from newtable", function (data, err) {

    callback(null, data);
    });
},
function(data, callback) {
    var _json_parse = JSON.parse(JSON.stringify(data));
    var rows = data.length;

    console.log(rows)
    var cnt = 1;

    for (var row = 1; row <= rows; row++) {

    logger.info(_json_parse[row-1].EMPNUM);
    //console.log(dateFormat(_json_parse[row].datae));                      
    var req = 'https://pratik.com/ta/rest/v2/companies/|RHV/employees/|' +_json_parse[row-1].EMPNUM + '/timesheets?date=' + dateFormat(_json_parse[row-1].datae, "isoDate");
    //console.log(req);
    var myXMLText = req;

    reques.push(myXMLText);

    }
   // console.log(reques);

    for (var a = 0; a < rows; a++) {
         //CURRENTLY PROCESSING ALL REQUEST IN IF BLOCK AND STOP FOR 15 SEC FOR ONLY FIRST IF CONDITION AFTER THAT ALL IF CONDITION PROCESSING WITHOUT HALT
    if(a%5==0)
    {
        console.log("if");
        //console.log(reques[a]);

        //postreq(reques[a],token,sleeped(a));
      /*  setTimeout(function(){sleeped(reques[a],token);;

    },15000); */
        sleeped(reques[a],token);


        //SHOULD PROCESS IF BLOCK ONCE AND STOP FOR 15 SEC
    }
    else
    {

        postreqELSE(reques[a],token);
        //SHOULD PROCESS ALL REQUECT IN ELSE BLOCK TILL IF CONDITION ABOVE NOT SATISY

    }

    }

Promise.all(ps)
.then((results) => {
console.log("results"); // Result of all resolve as an array
}).catch(err => console.log("err")); 
},
], function(err, result) {
if (!err)
    console.log("Successfully completed")
else console.log(err);
});
};

function callback() {
console.log("completed successfully");
}

function postreq(request1,token)
{
//BLOCK

    }

    function sleeped(requesarr,token)
    {
    console.log("in sleeping");
    //console.log(requesarr,token)

    setTimeout(function(){
        postreq(requesarr,token);
    },15000);}


    function postreqELSE(request2,token1)
{
console.log("in 3RD function");
   //BLOCK2

    }

当然,这个问题之前在这里得到了回答:

下面是一个示例,它将执行您的请求:

var reques = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function checkLoop()
{
  for (var a = 0; a < 20; a++)
  { console.log("["+a+"] a%5 is: "+a%5);
    console.log ( new Date().toLocaleTimeString());
    if(a%5==0)
    { console.log("if");
    console.log ( new Date().toLocaleTimeString());
    await sleep(15000);
    }
    else
    { console.log("else");
    console.log ( new Date().toLocaleTimeString());

    }
  }
}
checkLoop();
如果您不能使用异步,那么请尝试这种方法:将间隔设置为1.5秒,以便于测试。只需将1500到15000的时间更改为15秒

var reques = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var _interval;
var timeToWait = 1500;
function checkLoop(_init)
{
  clearInterval(_interval);
  console.log("checkLoop entered with value of: ", _init);
  var start = (typeof(_init) == "undefined") ? 0 : _init;
  console.log("start is: "+start);
  for (var a = start; a < 20; a++)
  { console.log("["+a+"] a%5 is: "+a%5);
    console.log ( new Date().toLocaleTimeString());
    if(a%5==0)
    { console.log("if");
    console.log ( new Date().toLocaleTimeString());
    (function(_idx){_interval = setInterval(function(){checkLoop(_idx+1)}, timeToWait);})(a)
    break;
    }
    else
    { console.log("else");
    console.log ( new Date().toLocaleTimeString());

    }
  }
}
checkLoop();

您提供的代码太长,请制作一个最小的示例代码来重现您的问题。要在for循环中为var a=0共同控制执行;a<行;a++{ifa%5==0{console.logif;//console.logreques[a];//postreques[a],token,sleepeda;//setTimeoutfunction{sleepedRequests[a],token;;},15000;*/sleepedRequests[a],token;//postrequeques[a],token,sleepeda;}else{console.logelse;//console.logreques[a];//PostReqeques[a],token,sleepeda;PostReqeElsereques[a],token;}}使用Promish库和计数器,您可以存档此文件。感谢您的更新,但此异步前缀在v7及以上版本的节点中工作,babel也无法帮助我们。答案已更新,以提供避免使用异步前缀的替代方法。使用setInterval和clearInterval处理计时,使用break退出当前循环。递归地调用自身,直到循环耗尽。如果这是正确的答案,请标记它。谢谢
var reques = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var _interval;
var timeToWait = 1500;
function checkLoop(_init)
{
  clearInterval(_interval);
  console.log("checkLoop entered with value of: ", _init);
  var start = (typeof(_init) == "undefined") ? 0 : _init;
  console.log("start is: "+start);
  for (var a = start; a < 20; a++)
  { console.log("["+a+"] a%5 is: "+a%5);
    console.log ( new Date().toLocaleTimeString());
    if(a%5==0)
    { console.log("if");
    console.log ( new Date().toLocaleTimeString());
    (function(_idx){_interval = setInterval(function(){checkLoop(_idx+1)}, timeToWait);})(a)
    break;
    }
    else
    { console.log("else");
    console.log ( new Date().toLocaleTimeString());

    }
  }
}
checkLoop();