2015-11-04 27 views
-4

請幫我調試這段代碼。當我使用while循環時,它會掛起。這種情況是我想發送一個帖子請求,當base64字段不是空的了。我不能使用setTimeout函數,因爲編碼時間是動態的,取決於文件大小。JS - 無限while循環但條件已經是假的

$(document).on('change','.contract-file', function(){ 
 
     var textField = $(this).siblings('input:not(.contract-file-encoded)'); 
 
     var fileName = $(this).val().split("\\").pop(); 
 
     var contractId = $(this).closest('.personal-accordion').find('input[type=hidden].contractId'); 
 
     var staffId  = $('input[name=staffId]').val(); 
 
     var base64Holder = $(this).siblings('.contract-file-encoded') 
 
     textField.val(fileName); // show filename 
 
     var input = $(this); 
 

 
     setTimeout(function(){ 
 
     var fileUpload = new FileReader; 
 
     var file = input[0].files[0]; 
 
     var image = new Image(); 
 

 
     setTimeout(function(){ 
 
      fileUpload.onload = function (e){ 
 
      return function (e){ 
 
       base64Holder.attr("value",e.target.result); 
 
      } 
 
      }(file); 
 

 
     fileUpload.readAsDataURL(file); 
 
     }); 
 
     }); 
 

 
     while(base64Holder.val().length <= 0){ 
 
     console.log('encoding...'); 
 
     } 
 
     
 
     var params = { 
 
     _method: 'put', 
 
     contract_id: contractId.val(), 
 
     is_saving_contract_file: 1, 
 
     attribute: { dummy: 'dummy'}, 
 
     contract_file: base64Holder.val() 
 
     }; 
 

 
     $.post("/ajax/staffs/"+staffId, params, function(data){ 
 
     console.log('Ajax return:'); 
 
     console.log(data); 
 
     }); 
 

 
    });

+0

'我不能用的setTimeout function' - 但你使用它... ...兩次不適當 –

+0

對不起,先生只是複製從我的同事粘貼一些代碼.. – Frocky

+0

我的意思是,我不能使用的setTimeout(函數(),延遲),因爲延遲是動態的(取決於文件的編碼時間)。假設5Mb文件需要10秒,但1kb在1秒內完成。希望你明白我的觀點。 – Frocky

回答

0

JavaScript是同步的引擎蓋下,所以你不能做你在做什麼,因爲進入循環的時候JS沒有時間來執行回調。

+0

感謝點同步的事情,我仍然是一個新手js開發人員。我想知道你是否有任何想法讓我的邏輯工作? – Frocky