如果循环包含带回调的函数调用,如何验证 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();
        }

    });
}