-1

Проблемы ниже У меня есть arr_x array.And я называю функцию «call_when_drop», как показано нижеAsynchronous JavaScript не синхронен оно не ждать процессы массива комплектных на событии перетаскивания

<body ondrop="call_when_drop(event,this);" ></body> Затем начинает создавать элементы массива .Если я скрою длину массива журнала, я вижу только 1, но когда я консолью журнал через несколько секунд, я вижу все количество элементов массива. Но интересно то, что когда я массив console.log, я сам могу видеть все элементы

ниже функции относятся к здесь Does HTML5 allow drag-drop upload of folders or a folder tree?

var arr_x=[]; 
    function traverseFileTree(item, path,connection_time) { 
     if(arr_x.length>25){ 
      return arr_x; 
     } 
     arr_x[arr_x.length]=arr_x.length; 

    path = path || ""; 
    if (item.isFile) { 
    } else if (item.isDirectory) { 

    var dirReader = item.createReader(); 
    //console.log(dirReader); 
    dirReader.readEntries(function(entries) { 

     var dir=[]; 
     for (var i=0; i<entries.length; i++) { 

     traverseFileTree(entries[i], path + item.name + "/",connection_time); 


     } 

    }); 
    } 

    return arr_x; 
} 

Эта функция вызывается, когда падение пользовательской папки в браузере

function call_when_drop(e,element){ 


var items = e.dataTransfer.items; 

    for (var i = 0, item; item = items[i]; ++i) { 

     if (item.kind == 'file') { 


      var a = traverseFileTree(item.webkitGetAsEntry(),""); 


     console.log(arr_x); 
    console.log('with_setTimeout'); 
     console.log(arr_x.length); 
    console.log('---------------------------------------'); 
    setTimeout(function(){ 

     console.log('with_setTimeout'); 
     console.log(arr_x.length); 

    },300); 

     } 
    } 


} 

Примечание: Я заметил, что если я изменю traverseFileTree функции, как показано ниже это работает, но мне нужно, прежде чем рабочая версия функция в

function traverseFileTree(item, path,connection_time) { 
if(arr_x.length>25){ 
    return arr_x; 
} 


arr_x[arr_x.length]=arr_x.length; 
    traverseFileTree(); 
    return arr_x; 
} 
+1

Исследование обратных вызовов. Чтение из потоков не блокирует IO. Его в основном делают все это одновременно, и вы не ожидаете, что они закончат – magreenberg

+0

@magreenberg, пожалуйста, просмотрите мой обновленный вопрос и как я могу это исправить? – user7352487

+1

'javascript имеет ошибку, которая не ждет' - ваша фактическая проблема заключается в том, что 'асинхронный javascript не является синхронным' –

ответ

0

Поскольку это, очевидно, только хром-вопрос (функция webkitGetAsEntry ограничивает использование), я могу видеть, как вы могли бы это сделать, используя добрые обещания - не то, что только Chrome поддерживает обещания, это просто, так как это Хром вопрос, я могу быть некоторые Обещания доступны

Примечание: Я вижу, что по крайней мере, светлячок на самом деле имеет функцию webkitGetAsEntry !!!)

var readEntriesPromise = function() { 
    return new Promise((resolve, reject) => this.readEntries(resolve, reject)); 
}; 

function traverseFileTree(item, path, connection_time) { 
    path = path || ""; 
    if (item.isDirectory) { 
     var dirReader = item.createReader(); 
     dirReader.readEntriesPromise = readEntriesPromise; 
     return dirReader.readEntriesPromise() 
      .then(entries => entries.filter(entry => entry.isDirectory)) 
      .then(dirs => Promise.all(dirs.map(entry => traverseFileTree(entry, path + item.name + "/", connection_time)))) 
      .then(result => [].concat.apply([path + item.name], result)); 
    } else { 
     return Promise.resolve("NO FOLDER"); // initial item was not a folder 
    } 
} 

function call_when_drop(e, element) { 
    var items = e.dataTransfer.items; 
    [].filter.call(items, item => item.kind == 'file') 
     .forEach(file => traverseFileTree(file.webkitGetAsEntry(), "") 
      .then(function(results) { 
       console.log(results); 
      }) 
     ) 
} 

Проверили в Firefox теперь, когда я знают, что имеет функцию webkitGetAsEntry - доказательство концепции - https://jsfiddle.net/a5cggfq3/3/

+0

Мне нужно определить индекс dirReader, как и раньше, для – user7352487

+0

почему, вы не используете его нигде. –

+0

приводит к финальной консоли.log - это массив - поэтому каждая запись имеет индекс –