2015-08-18 3 views
0

В следующем коде я хочу обрабатывать несколько файлов одновременно, не дожидаясь конца друг друга. По этой причине я сначала прочитал файлы (массив), а затем обратный вызов вызывается для обработки элемента этого экземпляра массива.Javascript for-loop async Выполнение файла

Я нашел проблему в этом javascript-коде, точно в async for-loop, где этот процесс выполняется как код синхронизации вместо async.

var array = ['string1','string2','string3','string4']; 

function processArray (arrayString,callback){ 
    //Read file Example.csv thought sync way 
    try{ 
     var ifs = new InputFileStream('Example.csv','utf8'); 
     table = ifs.read(0); 
     ifs.close(); 
    }catch(err){ 
     console.log(err.stack); 
    } 

    callback(arrayString, table); 

} 

//Async for 
for (var i=0; i<array.length; i++) {     
    processArray(array[i], function(arrayString, table){ 
     //Here process the file values thought async way 
     console.log('processed_'+i); 
    }); 
} 
+2

Что заставляет вас думать, что эта конструкция должна вести себя асинхронно? – Cerbrus

+0

Я предполагаю, что этот пример является правильным способом реализации async для цикла. Вы знаете какой-либо другой способ сделать это? – JosepB

+0

То, что я намекал, это то, что это не асинхронный. Что заставляет вас думать, что это так? – Cerbrus

ответ

1

Вы можете перевести звонок в setTimeout с задержкой в ​​1 мс. Это запустит его в следующем блоке выполнения, и ваш цикл будет продолжен.

например. использовать это:

setTimeout(function() { callback(arrayString, table); }, 1); 

вместо этого:

callback(arrayString, table); 

Альтернативой этому является выполнение обратного вызова на отдельном потоке с помощью Web Workers. Я не думаю, что это дало бы длинный ответ, описывающий, как делать многопоточный JavaScript здесь, поэтому я просто оставлю ссылку на документы. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

0

, где этот процесс выполняется в синхронизации кода вместо асинхронном

Я видел, что вы просто должны найти ответы на ваш вопрос, помните, что JavaScript является один поток.

Итак, для этого, когда вы выполняете операции, требующие полного использования CPU, например, для ... oops, while и т. Д .; вы просто получите ваш код работает синхронным и не только то, что,

вы получите ваше веб-страницу замораживания если они огромные петли

Позвольте мне привести вам пример, это в то время как цикл, который будет работать в течение 6 секунд, посмотрите, как вы ничего не можете сделать в stackoverflow.

function blocker (ms) { 
 
    console.log('You cannot do anything') 
 
    var now = new Date().getTime(); 
 
    while(true) { 
 
     if (new Date().getTime() > now +ms) 
 
      return; 
 
    } 
 
} 
 
blocker(6000) //This stop your entire web page for 6 seconds

Если вы действительно хотите добиться запуска блокировки коды в фоновом режиме чтения о Web Workers или вы можете просто использовать небольшую библиотеку, которую я написал, что позволит вам выполнить функцию блокировки центрального процессора в Я назвал это GenericWebWorker

Смежные вопросы