2015-11-04 28 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