2015-11-22 6 views
0
var fs=require('fs'); 
var path=require('path'); 

module.exports.getFiles=function(filepath,callback) { 

    var files=[]; 
    fs.exists(filepath,function(exists){ 
     if(exists){ 

      fs.stat(filepath,function(error,stats){ 
       if(error){} 
       else{ 
        if(stats.isDirectory()){ 

         fs.readdir(filepath,function(error,filelist){ 
          if(error){} 
          else{ 
           filelist.forEach(function(file){ 
            var obj={}; 

            fs.stat(path.join(filepath,file),function(error,stats){ 
             if(error){} 
             else{ 
              if(stats.isDirectory()){ 
               obj.type='directory'; 
              } 
              else{ 
               obj.type='file'; 
              } 

              obj.name=file 
              console.log(obj); 
              files.push(obj); 
             } 
            }); 
           }); 

           console.log("callback") 
           callback(files); //problem is here 
          } 
         }); 

        } 

       } 
      }); 

     } 
    }); 

} 

Я написал функцию, которая получает список файлов с данного пути. Я посылаю обратный вызов этой функции. функция обратного вызова отображает веб-страницу ответа. Но Callback выполняется до завершения всей функции. из-за этого я получил пустой ответ на веб-странице. есть ли способ решить это.Node.js Обратный вызов, выполненный до завершения всей функции

+1

Этот код меня пугает. используйте https://github.com/caolan/async – deltree

+0

Это законный вопрос. Почему голосуют? – Nocturno

+0

Я смущен незримыми голосами. который я должен сейчас рассмотреть? –

ответ

0

Кроме очень плохой обработки ошибок, которая является открытым окном для многих ошибок. Вы в основном выполняете асинхронный метод fs.stat внутри цикла forEach.

Петля пожаров fs.statsfilelist.length раз, а затем выполнение обратного вызова без fs.stats результатов

EDIT: Это способ сделать это без использования async.js или обещание, обратите внимание, что обратный вызов первым аргумент для обработки ошибок и второй аргумент для ваших желаемых файлов.

function getStatForFiles(index,callback){ 
    if(index < filelist.length){ 
     fs.stat(path.join(filepath,filelist[index]),function(error,stats){ 
      if(error){ 
       callback(error) 
      }else{ 
       var obj = {}; 
       if(stats.isDirectory()){ 
        obj.type='directory'; 
       }else{ 
        obj.type='file'; 
       } 

       obj.name=file 
       console.log(obj); 
       files.push(obj); 
       getStatForFiles(++index,callback) 
      } 

     }); 
    }else{ 
     callback(null,files) 
    } 
} 
getStatForFiles(0,callback) 
+0

Есть ли способ получить статистику для всех файлов с отсутствием цикла? –

+0

ответил с помощью редактирования. – yosiweinreb

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