Node.js 如何一次调用一个节点循环中的函数
这个代码块首先处理else块,然后是if块,对于所有请求,我需要一个执行5次迭代并停止15秒的代码。然后再次从接下来的5次迭代开始,依此类推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)
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();