2016-12-03 4 views
0

У меня есть следующий Java Script фрагмент коды:Wiered поведения Javascript

function upoload_TC(evt) { 
    var file = evt.target.files[0]; 
    if(file.type != 'text/plain'){ 
     evt.target.style='color:red;'; 
    } 
    else{ 
     var app_data=''; 
     reader = new FileReader(); 
     reader.onload = function(){ 
      app_data = reader.result; 
     }; 
     reader.readAsText(file); 

     if (evt.target.id[7]=='2') { 
/* area of intrest begin: */ 
      var packet_order = get_packet_order(evt.target); 
      console.log("1st"); 
      var app_data1 = app_data.split('\n'); 
      console.log("app_data: "); 
      console.log(app_data); 
      console.log("app_data1: "); 
      console.log(app_data1); 
/* area of intrest end */ 
      for(var i=0; i<app_data1.length; ++i){ 
       console.log("3st"); 
       if(app_data1[i][0] == '!'){ 
        app_data1.splice(i,1); 
        --i; 
        console.log(app_data1); 
       } 
       console.log(app_data); 
       ... 
      } 
     } 
    } 
} 

app_data имеет длинную строку.

После выполнения, иногда у app_data1 нет содержимого.
Наблюдение: Когда я выполняю его шаг за шагом в отладчике, app_data1 имеет ожидаемое значение. Но если моя первая точка останова после оператора присваивания для app_data1, она пуста.

Как это исправить?

Я нашел call_back и promises для решения подобных проблем для пользовательских функций. Поскольку split() не определен мной, я думаю, что это не сработает.
Я считаю, что timeout - это неправильный способ сделать это. Это?

Просмотрите видео окно отладчика here.

+2

Ваше понимание неверное. Заявления, которые у вас есть, будут исполняться в указанном порядке. Журнал не будет запускаться до завершения разделения. – dman2306

+0

Что может быть причиной вышеуказанного наблюдения? –

+0

Я подозреваю, что код, который вы указали, не является вашим настоящим кодом, поэтому я не могу ответить на это. – dman2306

ответ

1

Вы должны делать протоколирования/обработки внутри onload обратного вызова. В вашем примере кода вы устанавливаете значение app_data на событие load, которое запускается после того, как асинхронная функция readAsText заканчивает свою работу. К тому времени код регистрации/обработки уже выполнен.

+0

Итак, вы говорите, что код, помеченный как «область интересов», выполняется даже до 'reader.readAsText (file),' заканчивает загрузку 'reader'? Поэтому перемещение блока 'if' внутри' onload' должно работать. - Я попробую. –

+0

Не могли бы вы объяснить, почему контент был непустым при отладке? –

+1

Потому что, когда вы отлаживаете строку за строкой, 'readAsText' будет закончен, прежде чем вы попадете в интересующую вас группу, и в этом случае вы будете иметь значение для' app_data'. – Dan

0

Попробуйте это:

var stringSplit = function (str) { 
    return new Promise(function (resolve, reject) { 
    var splittedString = str.split('\n'); 
    return resolve(splittedString); 
    }); 
} 

var veryLongStr = "very long string"; 
stringSplit(veryLongStr).then(function (splittedString) { 
    console.log(splittedString); 
}); 
+0

Как это решить? – dman2306

+1

Я понимаю, что в то время, когда вы ответили, OP еще не предоставил свой полный код, но зачем вы завершаете синхронный вызов функции, такой как '.split()' в обещании? – nnnnnn

 Смежные вопросы

  • Нет связанных вопросов^_^