NodeJS и асинхронный ад

Я просто пришел к этой ужасной ситуации, когда у меня есть массив строк, каждая из которых представляет возможно существующий файл (например, var файлы = ['file1', 'file2', 'file3']. Мне нужно пройтись по этим именам файлов и попытаться посмотреть, существует ли он в текущем каталоге, и если да, то остановить петлю и забыть об остальных файлах. Так что, в принципе, я хочу найти первый существующий файл из этих файлов и вернуться к жестко закодированному сообщению, если ничего не было найдено.

Это то, что у меня сейчас есть:

var found = false;
files.forEach(function(file) {
  if (found) return false;

  fs.readFileSync(path + file, function(err, data) {
    if (err) return;

    found = true;
    continueWithStuff();
  });
});

if (found === false) {
  // Handle this scenario.
}

Это плохо. Он блокирует (readFileSync), поэтому он медленный.

Я не могу просто предоставить методы обратного вызова для fs.readFile, это не так просто, потому что мне нужно взять первый найденный элемент... и обратные вызовы могут быть вызваны в любом случайном порядке. Я думаю, что один из способов - это обратный вызов, который увеличивает счетчик и ведет список найденной/не найденной информации, и когда он достигает значения files.length, то проверяет найденную/не найденную информацию и решает, что делать дальше.

Это болезненно. Я вижу величие производительности в вычисленном IO, но это неприемлемо. Какие у меня есть варианты?

7
задан hexacyanide 18 December 2013 в 17:59
поделиться