2
我使用拖放功能創建了一個文件上傳表單,它在遞歸的文件夾上遞歸地迭代並上傳文件和文件夾,並將它們添加到JSTree實例中。只有在完成異步遞歸函數後才能延遲函數執行。
這裏的下跌回調
function drop(evt){
evt.stopPropagation();
evt.preventDefault();
//get selected node (created by jsTree)
var parent_id = $('#treeContainer').jstree('get_selected').attr('data-attr-itemid');
var theNodeId = $('#treeContainer').jstree('get_selected').attr('id');
for (var i=0; i<items.length; i++) {
var item = items[i].webkitGetAsEntry();
if (item) {
traverseFileTree2(item,parent_id,theNodeId);
}
}
//THIS RUNS BEFORE RECUSIVE FUNCTION IS COMPLETED
addFilesToUploadQueue(filesToQueue);
}
和這裏的遞歸遍歷功能
var filesToQueue = [];
function traverseFileTree2(item, parent_id, theNodeId, path) {
if (item.isFile) {
item.file(function(file){
//add parent id, and adds to array to be queued for upload
file.parent_id = parent_id;
filesToQueue.push(file);
})
return;
}
else if (item.isDirectory) {
var dirName = item.name;
var url = '<?php echo $this->Html->url(array('controller'=>'nodes', 'action'=>'addchild'));?>';
var data = {'parent_id':parent_id, 'name':dirName, 'type':'Directory'};
$.post(url,data,function(result){
//adds directory node to tree
$("#treeContainer").jstree('open_node','#'+theNodeId);
$("#treeContainer").jstree('create', '#'+theNodeId, 'last', result,null,true);
parent_id = result["attr"]["data-attr-itemid"];
theNodeId = result["attr"]["id"];
var dirReader = item.createReader();
dirReader.readEntries(function(entries) {
for (var i=0; i<entries.length; i++) {
traverseFileTree2(entries[i], parent_id, theNodeId, path + item.name + "/");
}
});
}, 'json');
}
}
我在這裏的問題是,功能完成traverseFileTree2
之前addFilesToUploadQueue(filesToQueue)
運行遞歸異步功能。我不想使用回調,如果這可以使用承諾來完成。
.file()是異步的 – josephtikva1
我最終重寫了這個。看到這個https://gist.github.com/josephtikva/7696280 – josephtikva1