gpt4 book ai didi

javascript - 递归函数内部的异步调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:44:55 24 4
gpt4 key购买 nike

我正在使用 CEF 在 javascript 中构建 native 桌面应用程序,而且我有 API 可以从 CEF 访问文件系统。我有一个senario,我需要在其中获取特定目录中所有文件的名称(可能有目录树)。我需要获取结果数组,我正在使用 jquery promises。我不明白的是:我什么时候解决获得最终结果数组的 promise ?

/*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);
});

如果我做错了,请提出任何其他技术:)

最佳答案

嗯,我看到很少有错误,当第一个 child 返回时,你解决了整个 promise ,你必须等待你的所有子目录完成相应的 promise ,并且你正在解决一个非内部的全局变量,看看这个有变化的例子:

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();
}

关于javascript - 递归函数内部的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com