如果循环包含带回调的函数调用,如何验证 for 循环是否完成了节点 js 中的所有迭代?
How to verify if a for loop completed all iteration in node js, if the loop contains a function call with callback?
我在一个函数中有这段代码。
for(var i = 0; i < common.template1.ROIs.length; i++)
{
var filename = './data/' + sessionid + '_' + common.template1.ROIs[i].name + '.jpg';
console.log(filename);
tesseract.process(filename, options, function(err, text){
if(err)
{
throw err;
}
var attr = filename;
attr = attr.replace('./data/' + sessionid + '_', '');
attr = attr.replace('.jpg', '');
retobj[attr] = text;
console.log(text);
});
}
res.send(JSON.stringify(retobj));
'retobj'是全局变量,初始化为空objectt,我想在for循环内添加所有属性后将其作为响应发送。我是 JS 的新手,发现它不能像在其他编程语言中那样工作。 for 循环中的回调是异步执行的,并返回一个空白对象。发回 retobj 并查明是否所有回调都已完成的正确方法是什么?
提前致谢。
一种丑陋但简单的方法:
var loopsFound = common.template1.ROIs.length,
allowSend = loopsFound;
function sendRetObj(){
allowSend--;
if(allowSend < 1){
res.send(JSON.stringify(retobj));
}
}
for(var i = 0; i < loopsFound; i++)
{
var filename = './data/' + sessionid + '_' + common.template1.ROIs[i].name + '.jpg';
tesseract.process(filename, options, function(err, text){
try {
if(err)
{
throw err;
}
var attr = filename;
attr = attr.replace('./data/' + sessionid + '_', '');
attr = attr.replace('.jpg', '');
retobj[attr] = text;
}
catch(err){
throw err;
}
finally{
sendRetObj();
}
});
}
我在一个函数中有这段代码。
for(var i = 0; i < common.template1.ROIs.length; i++)
{
var filename = './data/' + sessionid + '_' + common.template1.ROIs[i].name + '.jpg';
console.log(filename);
tesseract.process(filename, options, function(err, text){
if(err)
{
throw err;
}
var attr = filename;
attr = attr.replace('./data/' + sessionid + '_', '');
attr = attr.replace('.jpg', '');
retobj[attr] = text;
console.log(text);
});
}
res.send(JSON.stringify(retobj));
'retobj'是全局变量,初始化为空objectt,我想在for循环内添加所有属性后将其作为响应发送。我是 JS 的新手,发现它不能像在其他编程语言中那样工作。 for 循环中的回调是异步执行的,并返回一个空白对象。发回 retobj 并查明是否所有回调都已完成的正确方法是什么? 提前致谢。
一种丑陋但简单的方法:
var loopsFound = common.template1.ROIs.length,
allowSend = loopsFound;
function sendRetObj(){
allowSend--;
if(allowSend < 1){
res.send(JSON.stringify(retobj));
}
}
for(var i = 0; i < loopsFound; i++)
{
var filename = './data/' + sessionid + '_' + common.template1.ROIs[i].name + '.jpg';
tesseract.process(filename, options, function(err, text){
try {
if(err)
{
throw err;
}
var attr = filename;
attr = attr.replace('./data/' + sessionid + '_', '');
attr = attr.replace('.jpg', '');
retobj[attr] = text;
}
catch(err){
throw err;
}
finally{
sendRetObj();
}
});
}