2013-06-12 172 views
19

ファイルを読み込んで、FileReaderオブジェクトを使用してbase64でエンコードされた文字列に変換します。Javascriptでファイルを同期して読み込みます。

 

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


しかし、この場合には、私は、イベントハンドラ(onLoadEndイベント)での変換の結果を得る:ここでは私が使用するコードです。私は同期メソッドが欲しいです。 "readAsDataURL"メソッドが 'result_base64'変数の値を直接返す方法はありますか?

ありがとうございました

+3

*「私は同期メソッドが必要です」*何らかの理由があるのはなぜですか?私はそれが可能だとは思わない。 –

+0

firefoxにはfile.getAsDataURL()メソッドがありましたが、廃止され、いずれのブラウザーの同期バージョンでもありませんでした。 – dandavis

+0

私はローカルストレージデータベースにパスを保存し、後でサーバーにイメージを送信する必要があります(すべてのイメージにループがあるので、同期メソッドが必要です)。 ローカル記憶域の制限を超えないように、データベースにbase64文字列を格納しないようにしたいと思います... – Laila

答えて

10

同期タスク(ブロック)は一般的に不良です。非同期にそれを行う本当の理由がない場合は、イベントコールバックを使用することを強くお勧めします。

ファイルが壊れていてHTML5 APIが読み込めないとしたら、結果は得られません。それはあなたのコードを壊し、サイトをブロックするでしょう。または、誰かが10GBファイルを選択すると、ファイルが完全に読み込まれるまでHTMLページがフリーズします。その非同期イベントハンドラを使用すると、起こりうるエラーをキャッチできます。

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); 

チェック機能、チェックレディフラグ変数がtrueに設定されている場合、毎秒:

は、コールバックでの制限を回避するには、私は簡単なトリックを使用しています。もしそうなら、あなたは結果が利用可能であることを確かめることができます。

これはベストプラクティスではないかもしれませんが、このテクニックを使ってwebappを作ったのは、同時に10回以上のsetTimeoutsを実行していて、今まで問題はありませんでした。

+0

私は同じようなトリックを持っていましたが、コードをループに挿入すると壊れました。最後にコールバックメソッドとクロージャを組み合わせて、ループが終了したときを知りました。 – Laila

+1

コールバックにパラメータ変数を渡したかったのとまったく同じ問題がありました。目的は、ファイルをチャンクに分割して、チャンク単位でサーバーに送信できるようにすることでした。閉鎖は一度理解された素晴らしいことです。 –

+0

https://stackoverflow.com/a/46832928/851951このアプローチは良いことですが、非同期で動作し続けます。 – Dani

-3

ビジネスで遅れるかもしれませんが、これが誰かを助けるかもしれません。私たちは単に部屋の外で戦うことができます。

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

これがどのように同期しているかはわかりません。 – Nathan

+0

そうではありません。これは非同期的なやり方です。 – trinalbadger587

0
のNode.js、 child_processから使う execSync

とシェルが同期あなたのためにそれを読んでいます。この子プロセスの出力を親にリダイレクトします。

// 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賞にあなたの指名を喜んで受け入れます。 ;)

関連する問題