我在服務器上有一個文件夾層次結構。我想循環遍歷這個層次,並且遞歸地,當找到一個文件時,調用一個自定義方法。Promise&遞歸,如何處理沒有回調的找到的項目?
現在,我的代碼看起來是這樣的:
searchFile(root, handleFile);
// loop over all folders recursively, then handle files
function searchFile(item, callbackWhenFile) {
if (itIsFolder(item)) {
$http.get("api.call.com/children/" + item.id)
.then(function (children) {
angular.forEach(children,
function (child) {
searchFile(child, callbackWhenFile);
});
});
}
else {
// this is not a folder, so this is a file
callbackWhenFile(item);
}
}
回調是用來代替承諾的事實是不是一件好事。
但我試圖找到一種方法,使它與承諾一起工作,沒有機會。
在一個理想的解決方案,我想這樣做:
searchFile(root).then(function (file) {
handleFile(file)
});
我看着q.all $,$ q.when,但似乎沒有適應這種情況。我們不知道我們將要使用的文件數量,這使得問題變得困難。
任何人都有一個想法如何解決這個問題?
編輯答案
Promises are not the way to go.
隨着RxJS和觀察對象,這可以寫成:
getFileStream(root).subscribe(function (file) {
handleFile(file);
});
function getFileStream(root) {
var source = Rx.Observable.create(function (observer) {
observeFiles(observer, root);
});
return source;
}
function observeFiles(observer, item) {
if (itIsFolder(item)) {
$http.get("api.call.com/children/" + item.id)
.then(function (children) {
angular.forEach(children,
function (child) {
searchFile(observer, child);
});
});
}
else {
observer.onNext(item);
}
}
更好地重寫服務器的方法。使999請求搜索單個文件?這在現實生活中如何工作? –