5

ファイルからテキストを読み取り、関数で返したい。だからここに私のコードの重要な部分があります:

        function getFileRequest(id, contentType, callback) {
        var val = "x";      

        if (window.File && window.FileReader && window.FileList && window.Blob) {
            var element = document.getElementById(id);

            var file = element.files[0]; 
            if(file != null) {      
                if(file.type.match("text/xml")){
                    var r;
                    r = new FileReader();

                    r.onload = function (e) {
                        val = e.target.result;                    

                    }                   
                    r.readAsText(file);
                }
                else
                    alert("Wrong file format");
            }

        } else {
            alert('The File APIs are not fully supported by your browser.');
        }

        alert(val);
        if(val == null)
                return "";
            else
                return getRequestBody(id,contentType,val);  

    }

テキストを「val」という変数に渡したい。しかし、少なくとも私には思えるように、おそらく onload 関数が実行されるのを待っていないため、alert(val) は常にデフォルトの「x」を表示しています。私はまったく正しいですか?そのテキストにアクセスするにはどうすればよいですか?処刑を待つ方法はありますか?

4

1 に答える 1

11

もちろん、アラートは onload 関数には含まれていないため、すぐに呼び出されます。

あなたはそれを行うことができます:

        var val = "x";      
        //... code to load a file variable
        var r;
        r = new FileReader();

        r.onload = function (e) {
            val = e.target.result;  
            r.readAsText(file);
            alert(val);
        };  

コードの実行を待機して停止することはできないため、一般的な考え方は、コールバックを使用してコードを延期することです。

あなたが示すコードが実際に2つの部分で実行されると仮定すると、1つはファイル操作を行い、もう1つはそれを使用すると、次のようになります。

function fetchVal(callback) {
        var val = "x";      
        //... code to load a file variable
        var r;
        r = new FileReader();
        r.onload = function (e) {
            val = e.target.result;  
            r.readAsText(file);
            callback(val);
        };  
}

fetchVal(function(val){
   alert(val);
   // use val
});
于 2012-08-23T11:56:33.987 に答える