2013-06-12 12 views
19

Bir dosyayı okumak ve FileReader nesnesini kullanarak base64 kodlu bir dizeye dönüştürmek istiyorum.Javascript'te bir dosyayı senkronize olarak okuyun

 

    var reader = new FileReader(); 
    reader.onloadend = function(evt) { 
     // file is loaded 
     result_base64 = evt.target.result; 
    }; 
    reader.readAsDataURL(file); 


Ancak bu durumda, ben olay işleyicisi (onLoadEnd olay) dönüşümün sonucu elde Aşağıda kullandığım kod. Senkron bir yöntem istiyorum. "ReadAsDataURL" yönteminin doğrudan 'result_base64' değişkeninin değerini döndürmesinin bir yolu var mı? (Engelleme)

Teşekkür

+3

* "Senkronize bir yöntem istiyorum." * Herhangi bir sebep neden? Bunun mümkün olduğunu düşünmüyorum. –

+0

firefox, file.getAsDataURL() yöntemine sahip/sahipti, ancak kullanımdan kaldırıldı ve herhangi bir tarayıcının, afaik'in tek senkronizasyon sürümüdür. – dandavis

+0

Yolları bir yerel depolama veritabanında saklıyorum, görüntüleri daha sonra bir sunucuya göndermem gerekiyor (tüm resimlerde bir döngü ile, bu yüzden senkronize bir yönteme ihtiyacım var). Yerel depolama limitini aşmamak için veritabanında base64 dizelerini saklamaktan kaçınmak istiyorum ... – Laila

cevap

10

Senkron görevler genellikle kötü. Eşzamansız bir şekilde yapmanın gerçek bir nedeni yoksa, olay geri bildirimini kullanmanızı kesinlikle öneririz.

Dosyanızın bozuk olduğunu ve HTML5 API'sının okunamadığını düşünün, size sonuç vermeyecektir. Kodunuzu kırıp siteyi engellerdi. Ya da birisi, dosya tamamen yüklenene kadar HTML sayfanızı donduran 10GB'lık bir dosya seçebilir. Bu eşzamansız olay işleyicisi ile olası hataları yakalayabilirsiniz.

var ready = false; 
var result = ''; 

var check = function() { 
    if (ready === true) { 
     // do what you want with the result variable 
     return; 
    } 
    setTimeout(check, 1000); 
} 

check(); 

var reader = new FileReader(); 
reader.onloadend = function(evt) { 
    // file is loaded 
    result = evt.target.result; 

    ready = true; 
}; 
reader.readAsDataURL(file); 

kontrol fonksiyonu, çekler hazır bayrak değişkeni true olarak ayarlanırsa, her saniye:

geri aramaları ile sınırlamaları geçici olarak çözmek için, ben basit bir hile kullanır. Eğer öyleyse, sonucun mevcut olduğundan emin olabilirsiniz.

Bunu yapmak en iyi uygulama olmayabilir, ancak aynı anda 10 setTimeouts ile 30 kez bu tekniği kullanarak bir webapp yaptım ve şu ana kadar hiç sorun yaşamadım.

+0

Benzer bir numaraya sahibim, ancak kodu bir döngü içine eklediğimde kırıldı. Sonunda döngünün ne zaman bittiğini bilmek için bir kapatma ile birlikte geri arama yöntemlerini kullandım. – Laila

+1

Aynı değişkende parametre değişkenlerini geri aramaya iletmek istedim. Amacı dosyayı parçalara bölmek oldu, böylece sunucuya şaka olarak gönderebildim. Kapanışlar bir kez anladım harika bir şeydir. –

+0

https://stackoverflow.com/a/46832928/851951 Bu yaklaşım iyidir, ancak senkronize olmayan şekilde çalışıyor. – Dani

-3

Geç işte, ancak bu birilerine yardımcı olabilir. Sadece odanın dışındaki kavgaları yapabiliriz.

var file = $('#myfile')[0].files[0]; 

var reader = new FileReader(); 
reader.onload = function(progressEvent) { 
     //console.log(this.result); 
     handle(this.result); 
}; 
reader.readAsText(file); 

function handle(temp_lines) { 
    var inputLines=new Array(); 
    var lines = temp_lines.split('\n'); 

    for(var line = 0; line < lines.length; line++) { 
     console.log(lines[line]); 
     inputLines[line]=lines[line]; 
    } 
} 
+4

Bunun nasıl senkron olduğu açık değil. – Nathan

+0

Değil. Bunu yapmanın asenkron bir yolu. – trinalbadger587

0
node.js, child_process dan Kullanım execSync yılında

ve kabuk eşzamanlı sizin için okumak gerekir. Bu alt işlemin çıktısını ana bilgisayara yönlendirin.

// Don't forget to use your favorite encoding in toString() 
var execSync = require('child_process').execSync; 
var fileContents = execSync('cat path/to/file.txt', {stdio: "pipe"}).toString(); 

UUOC ödülü için adaylığınızı memnuniyetle kabul ediyorum. ;)

İlgili konular