大家
我正在使用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函数何时终止,那么我可以加载所需的数据。 如果还有其他方式请说。 提前谢谢。
答案 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并且比以前想象的更有趣。