Я только что попал в эту ужасную ситуацию, когда у меня есть массив строк, каждая из которых представляет возможно существующий файл (например, var files = ['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, но это недопустимо.Какой выбор у меня есть?