【问题标题】:how to call function in node loop one at a time如何一次调用一个节点循环中的函数
【发布时间】:2017-11-10 01:48:37
【问题描述】:

这个代码块首先处理 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

    }

【问题讨论】:

  • 您提供的代码太长,请做一个最小的示例代码来重现您的问题。
  • 想要共同控制 for 循环的执行 for (var a = 0; a
  • 使用 Promish lib 和 counter 你可以归档这个

标签: node.js loops asynchronous settimeout sequential


【解决方案1】:

当然,这个问题之前已经在这里回答过:What is the JavaScript version of sleep()?

以下是一个示例,可以满足您的要求:

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();

这会打印出以下内容:(部分)需要注意的是,它总是会在第一次迭代时暂停,因为索引从 0 开始,而不是 1。

[0] a%5 is: 0  
8:58:38 AM  
if  
[1] a%5 is: 1  
8:58:53 AM  
else  
8:58:53 AM  
[2] a%5 is: 2  
8:58:53 AM  
else  
8:58:53 AM  
[3] a%5 is: 3  
8:58:53 AM  
else  
8:58:53 AM  
[4] a%5 is: 4  
8:58:53 AM  
else  
8:58:53 AM  
[5] a%5 is: 0  
8:58:53 AM  
if  
8:58:53 AM  
[6] a%5 is: 1  
8:59:08 AM  
else  
8:59:08 AM  
[7] a%5 is: 2  
8:59:08 AM  
else  
8:59:08 AM  

如果您不能使用异步,请尝试以下方法:(将间隔设置为 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();

【讨论】:

  • 感谢更新,但是这个 Async 前缀在 v7 及更高版本的 node 中工作,babel 也无法帮助我们。
  • 答案已更新,以提供避免使用异步前缀的替代方法。使用 setInterval 和 clearInterval 来处理时间和 break 以退出当前循环。递归调用自身,直到循环耗尽。
  • 如果这对您来说是正确的答案,请标记它。谢谢。
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多