我正在使用CEF在javascript中构建本机桌面应用程序,并且我有从CEF访问文件系统的API。我有一个senario, 我需要在特定目录中获取所有文件的名称(可能有目录树)。我需要得到结果数组,我正在使用jquery promises。我不明白的是:我何时解决获得最终结果数组的承诺?
/*read all directories under this and get path*/
var result = [];
function _processEntries(dirPath) {
var dirEntry = new NativeFileSystem.DirectoryEntry(dirPath), deferred = new $.Deferred();
/*async call*/
dirEntry.createReader().readEntries(
function (entries) {
for (var i = 0; i < entries.length; i++) {
if (entries[i].isDirectory) {
_processEntries(entries[i].fullPath).done(function () {
deferred.resolve(result);
});
} else {
result.push(entries[i].fullPath);
}
}
},
function (error) {
console.log("Failed while reading dir:", error);
}
);
return deferred.promise();
}
//调用函数
_processEntries("C:/Users/abc").done(function(result){
console.log("FILES ARRAY:",result);
});
如果我做错了,请提出任何其他技巧:)
答案 0 :(得分:0)
嗯,我看到你在第一个孩子回来时解决了整个承诺的错误很少,你必须等待所有子目录完成各自的承诺,并且你要解决一个不是内部的全局变量,看看这个例子的变化: / p>
function _processEntries(dirPath) {
var result = [];
var dirEntry = new NativeFileSystem.DirectoryEntry(dirPath), deferred = new $.Deferred();
/*async call*/
dirEntry.createReader().readEntries(
function (entries) {
var promises = [];
for (var i = 0; i < entries.length; i++) {
if (entries[i].isDirectory) {
promises.push(_processEntries(entries[i].fullPath));
} else {
result.push(entries[i].fullPath);
}
}
if(promises.length === 0) {
deferred.resolve(result);
} else {
$.when.apply($,promises).done(function() {
result.concat(arguments);
deferred.resolve(result);
})
}
},
function (error) {
console.log("Failed while reading dir:", error);
}
);
return deferred.promise();
}
答案 1 :(得分:0)
何时解决承诺
异步调用结束时立即执行。否则你会得到deferred antipattern。避免这种情况,你可以在任何地方使用promises,并使用适当的组合。
此外,您不应在result
函数之外初始化_processEntries
变量 - 您在多次调用函数时会遇到大问题。
function getDirectoryEntries(dirPath) {
// a promise helper function
var dirEntry = new NativeFileSystem.DirectoryEntry(dirPath),
deferred = new $.Deferred();
dirEntry.createReader().readEntries(deferred.resolve, deferred.reject);
return deferred.promise();
}
function _processEntries(dirPath) {
return getDirectoryEntries(dirPath).then(function (entries) {
var promises = [];
for (var i = 0; i < entries.length; i++) {
if (entries[i].isDirectory) {
promises.push(_processEntries(entries[i].fullPath));
} else {
promises.push($.when(entries[i].fullPath));
}
}
return $.when.apply($, promises).then(function() {
return [].concat.apply([], arguments);
});
});
}
这样称呼:
_processEntries("C:/Users/abc").then(function(result){
console.log("FILES ARRAY:",result);
}, function (error) {
console.log("Failed while reading dir:", error);
});