2015-02-16 1 views
0

У меня есть этот фрагмент кода внутри функции.Как проверить, завершил ли цикл for все итерации в узле js, если цикл содержит вызов функции с обратным вызовом?

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, и я хочу, чтобы отправить его в качестве ответа после того, как все атрибуты добавляются внутри цикл. Я новичок в JS и узнал, что он не будет работать, как на другом языке программирования. Обратные вызовы внутри цикла выполняются асинхронно, и возвращается пустой объект. Каков правильный способ отправки обратно retobj и выяснить, были ли все обратные вызовы завершены? Спасибо заранее.

+0

Если вам нужно иметь все функции обратного вызова закончил, нужно код после цикла будет другой обратного вызова –

ответ

1

Некрасивая, но простой способ:

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

    }); 
} 
Смежные вопросы