Вы не можете вернуть файл, используя fs.readdir(), поскольку он просто выполняет обратный вызов асинхронно, когда чтение файла выполняется. Затем сам объект файла передается на обратный вызов в качестве параметра.
Если вы хотите, чтобы вернуть результат ReadDir, у вас есть два варианта:
1) Используйте synchronous version of readdir: это вернет файловую систему, как вы хотите, однако, он блокирует узел одного потока до его сделано, и это может привести к совершенно нежелательному поведению в вашей программе, и fi может быть серьезной проблемой в веб-приложении (все запросы от каждого клиента будут заблокированы до тех пор, пока не будет выполнено чтениеdirynync).
2) Используйте Promise. Promise фактически не возвращает такие значения, как синхронный код, но позволяет вам контролировать поток вашего асинхронного кода, как если бы он был синхронным, letting you to throw exceptions and chain return values in your code.
Fi, пример использования посылов с помощью Bluebird реализации (which requires to install the bluebird package):
var fs = require('fs');
var Promise = require('bluebird');
var dir = '/../../';
var ext = 'yml';
var readdirAsync = Promise.promisify(fs.readdir);
//var c = new Array(); You dont need c as a global now, since you can return the result of the function from inside the iterateOverDir function.
/*Now this function returns a Promise that will pass the readdir value when the promise is fullfilled*/
var test1 = function() {
/*yeah a single line function is pretty redundant but is to keep consistence with the OP code*/
return fs.readdirAsync(dir);
}
/*
and this function just iterates over list performing some actions and
returning a 'result' array. When this whole function is passed as a parameter in a .then(), it takes whatever the function inside the previous then/promise returns, and pass its return value to the next. This is true whenever the previous promise/then is synchronous or asynchronous code.
*/
var iterateOverDir = function(list){
var re = new RegExp("^.*\." + ext + "$");
list.forEach(function(item) {
var result = new Array();
if(re.test(item)) {
result.push(item);
}
return result;
}
test1.then(iterateOverDir).catch(console.log)
then(console.log /* or whatever function that uses the previous function return value.*/);
Теперь, благодаря обетованному, вы можете трубы к iterateOverDir() -Какие ведают Синхронные code- каждое значение от простого синхронный код или асинхронный. Однако вы должны сохранить свой код внутри цепочек .then(), then() ....
Если вы хотите вернуть массив, вы, вероятно, ищете версию синхронного чтения readdir https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options –
Почему вы хотите вернуть элемент из readdir? Это нигде не попадает – Jay