如何确定阅读目录是否完成

时间:2015-03-19 16:05:26

标签: node.js node-webkit

大家 我正在使用node-webkit开发某种图像视图应用程序。我创建了一个函数来读取给定位置内的dir并搜索图像文件(* .jpg和* .png)。我使用的代码如下:
     app.js

    var fs = require("fs");
    var gui = require('nw.gui');
    var win = gui.Window.get();
    var directory;
    var db = require('diskdb');
    var path = require('path')
    db = db.connect("lib/collections", ['temp']);


        function chooseFile(name) {
        var chooser = $(name);
        scr = 0;
        chooser.change(function(evt) {
            directory = $(this).val();
            var asdf;
            console.clear();
            readDir(directory);
            $(this).val('').hide();
        });
    }


    function readDir(directory){
    c = 0;
    console.log("reading "+directory);
if(fs.statSync(directory).isDirectory() == true){
    fs.readdir(directory,function(err,files){
        if (err){
            console.log(err);
            return;
        }           
        var ext;
        files.forEach(function(file){
            console.log("Got what: "+file);
            var fulls = directory+"\\"+file;
            if(file.indexOf(".") != 0){
                if(path.extname(fulls) == ""){
                    console.log("Got a directory: "+file);
                    if(fs.statSync(fulls).isDirectory() == true){
                        readDir(fulls);
                    }
                }
                else{
                    console.log("Got a file: "+file);
                    if(checkExtension(file, 'jpg,png')){
                        scr++;
                        c = saveTemp(fulls,scr,file);
                    }
                }
            }
        });
        if(c == 1){
            loadgun();
        }
    });
}
  }


        function loadgun(){
    if(db.temp.count()!=0){
        for(i=1;i<=db.temp.count();i++){
            var asd = db.temp.findOne({'id':i});
            var theTempScript = $("#tmpl-imgholder").html();
            var theTemp = Handlebars.compile(theTempScript);
            $("#ContentWrapper").append(theTemp({"fulls":asd.file, "id":asd.id, "title":asd.title}));
        }
    }
}

  saveTemp = function(file,id, title) {
    var savedUser = db.temp.save({
        file:file,
        id:id,
        title:title 
    });
    return 1;

};


    function checkExtension(str, ext) {
        extArray = ext.split(',');
        for(i=0; i < extArray.length; i++) {
            if(str.toLowerCase().split('.').pop() == extArray[i]) {
                return true;
            }
        }
        return false;
    };


$(document).ready(function(){
if(db.temp.count() != 0){
   loadgun();
}
else{
    $('#blah').css('display','block');
    chooseFile('#blah');
}
});

的index.html

<html>
.
.
.
<body>
<input type="file" nwdirectory id="blah" style="display:none"/>
    <script src="js/jquery.min.js"></script>
    <script src="js/app.js"></script>
    <script src="js/handlebars.js"></script>
    <script id="tmpl-imgholder" type="x-handlebars-template">
        <div class="image-container grid__item" data-id="{{id}}" data-src="{{fulls}}">
            <div class="cover" style="background:url({{fulls}})"  title="{{title}}"></div>
            <div class="info">
                <div class="title">{{title}}</div>
            </div>
            <div class="clear"></div>
        </div>
    </script>
</body>
</html>

这里我尝试使用loadgun函数加载数据。它挂起节点webkit窗口。如果我知道readDir函数何时终止,那么我可以加载所需的数据。 如果还有其他方式请说。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

readDir的问题在于它是异步函数,这就是你必须提供回调的原因。但是,您可以使用同步的fs.readdirSync(path),然后代码同步流动。 psoducode可能如下所示:

function readDirAsynch(dir){
 var files = fs.readdirSync(dir);
  for (var i in files){
    if (files[i] isDir){
      readDirAsynch(files[i]);
    } else if (myCondition){
    //do somehting
   }
  }
}    

不用说,你知道函数在函数调用执行后的下一行完成了

答案 1 :(得分:0)

快速回答: 你可以使用同步方法fs.readdirSync(path),一切都应该适合你。你不需要继续阅读。 https://nodejs.org/api/fs.html#fs_fs_readdirsync_path

我的个人建议:

由于node是单线程的,我建议你继续使用异步版本,但是为你的方法添加一个回调。

这意味着你的&#34; readDir&#34;方法也将是异步的。您只需要在方法中添加一个回调参数。 E.g。

readDir(dir, fnCallback) {
  ...
  fs.readdir(directory, function(err,files){

    ... doing cool stuff ...

    fnCallback();
  });
}

如果您想阅读有关编写异步代码的更多信息,本指南可能对您有所帮助。 http://callbackhell.com/

此外,如果你想进入美妙的异步世界,你可以看看“承诺”#39; https://www.npmjs.com/package/node-promise,&#39;未来&#39; https://www.npmjs.com/package/async-future,&#39; Async&#39; https://www.npmjs.com/package/async并且比以前想象的更有趣。