Может ли кто-нибудь проверить, является ли следующая концептуальная функция «неблокирующей»? - PullRequest
0 голосов
/ 10 ноября 2018

Пожалуйста, проверьте, если это следующая функция образца non-blocking

sample_function = function(input, fn){
  let count=0;
  for(let i=0; i<input.length; i++){
    db.query(`SELECT * FROM DB WHERE id=?`,[input[i].id], function(error, result){
      process_function(input[i], function(error, result2){
        count++;
        if(count===input.length){
          fn(input)
        }
      })
    })
  }
}

Если для полного выполнения for loop потребуется около 10 секунд (5 секунд для чтения из базы данных и 5 секунд для обработки с использованием локального потока (process_function), for loop заблокирует другие новые события на 10 секунд) ? Если да, то как бы вы исправили эту функцию, чтобы она не была блокирующей? Я пытаюсь научиться. Пожалуйста, помогите

1 Ответ

0 голосов
/ 10 ноября 2018

Цикл for синхронизирован, но внутри цикла for db.query не синхронизирован. Таким образом, в цикле for каждый запрос будет запускаться один за другим, но их выходные данные не будут появляться в последовательности.

Но вы можете решить эту проблему с помощью асинхронного и ждать. Это может сделать ваш код внутри для синхронизации цикла.

sample_function = async function(input, fn){
    let count=0;
    for(let i=0; i<input.length; i++){
        const query_data = await db.query(`SELECT * FROM DB WHERE id=?, 
                           [input[i].id]);
        const process_data = await process_function(input[i]);
        count++;
        if(count===input.length){
            fn(input)
        }
    }
}
...