0

このようなさまざまなアリアのすべてのデータを取得する関数を作成しました..

 function retrieveData(dom_sclapi) { 
        var apiResponse; 
        dojo.xhrGet({ 
                url : dom_sclapi, 
                handleAs: handle, 
                //sync: true, 
                headers: { "Accept": "application/json" }, 
                preventCache: true, 
                //Success 
                load: function(Response) { 
                        apiResponse = Response; 
                }, 
                // Ooops!  Error! 
                error: function(Error, ioArgs) { 
                        //apiResponse = Error; 
                        //console.log(ioArgs.xhr.status); 
                } 
        }); 
        //apiResponse 
        return apiResponse; 
    } 

しかし、apiResponse は未定義 on sync = false 状態を返します (ここでは、sync 属性にコメントすると)。sync = true でのみ正しいデータ出力を返します。そのため、Chrome と IE は同期呼び出しで他のすべてのアクションをブロックするため、スタイルの読み込み時に chrome と IE で問題が発生します。

どうすればこの状況を克服できますか? 私のコードの実際の問題は何ですか?

4

1 に答える 1

3

同期コードと非同期コードの背後にある考え方をよりよく理解する必要があります。

undefined同期されておらず、値がまだ利用できないため、これはまさに を返すケースです。同期として設定すると、残りのコードの実行は関数の戻りを待ちます。それ以外の場合は、結果を待たずにコードを続行させます。

非同期コードを記述している場合、コードの次の行で値が返されることを期待すべきではありません。代わりに、戻り値が利用可能になったときにイベントまたはコールバックを作成する必要があります。このload:場合の は、リクエストがレスポンスを受け取ったときのコールバックです。

Deferredオブジェクトに関するドキュメントも参照してください。それらはxhrGetでも説明されています

したがって、上記のコードは次のようになります。

function retrieveData(dom_sclapi, callback) { 
        // Will return Deferred object
        return dojo.xhrGet({
                url : dom_sclapi, 
                headers: { "Accept": "application/json" }, 
                preventCache: true, 
                // Pass callback function to do something with response
                load: callback,
                error: function(Error, ioArgs) { 
                        //console.log(ioArgs.xhr.status); 
                } 
        }); 
    }
// Or get data by deferred object
retrieveData(url, null).then(function(Response){ /* Do something with response */ })
// Via callback
retrieveData(url, function(Response){ /* Do something with response */ });
于 2012-08-02T11:26:50.120 に答える