2012-01-23 2 views
1

私はデータを取得するために別の関数を呼び出す関数を持っています。そのデータはローカルにキャッシュされている可能性があります。または、取得する必要があります。ローカルキャッシュは簡単です。しかし、もし私が$ .getJSONを使って、asyncをオフにしてブラウザをロックせずに取得すれば、そのデータを元の関数に戻す方法はありますか?jQuery:データが条件付きでAJAX経由でリクエストされた場合の返信方法

次のコード、すなわち、:

1)バーので()はもはやDATAXが起こっているparseData()戻り、存在しませんか? 2)bar()とparseData()の両方がコールし、リクエストが進行中にブラウザをロックせずにもう1つのコールバック層を持たない場合、dataXをparseData()からfoo()に戻すにはどうすればよいですか? ?

var foo = function() { 

    $('body').text(bar()); 

}; 

var bar = function() { 

    var parseData = function (dataX) { 
     // do something to data 
     return dataX; 
    }; 

    if (localStorage.hasOwnProperty('someKey')) { 
     return localStorage.getItem('someKey'); 
    else { 
     $.getJSON('http://somewhere.api.com?fubar=good', parseData); 
    } 

}; 

答えて

2

あなたが返すことができない。

あなたが実際に要素の.text()関数を呼び出すのテキストを変更し、parseData機能を持つようにしたい要素に渡すためにあなたのコードの流れを変えることができます非同期呼び出し。だけではなく、コールバックとしてのfooを呼び出す:

var foo = function (text) { 

    $('body').text(text); 

}; 

var bar = function() { 

    var parseData = function (dataX) { 
        // do something to data 
        foo(dataX.someText); 
    }; 

    if (localStorage.hasOwnProperty('someKey')) { 
        foo(localStorage.getItem('someKey')); 
    else { 
        $.getJSON('http://somewhere.api.com?fubar=good', parseData); 
    } 

}; 
+0

$ .getJSONはjQueryのデフォルト引数の外でparseDataに引数を渡すことはできますか?すなわち、最初にfoo()を呼び出したイベントをトリガした(この場合は)

+0

私はあなたが何を意味するのか分かりません。parseDataはクロージャスコープ内のすべてにアクセスできます。 – Daff

+0

ああ、そうだよ。私はfoo()をオーバーロードし、呼び出し先と呼び出し元の両方になるようにします。 – BrianFreud

2

ので(リターンがテキストではないので)任意のテキストを設定しませんtext() jQueryの機能でそれを直接呼び出すbar関数からの戻りはありません。作るとき

var foo = function() { 

    //here we call the `bar` function and pass the element we want to change the text of as an argument 
    bar('body'); 

}; 

var bar = function (element_str) { 

    //here we use the argument we passed to create a jQuery object of the element to use later 
    var $element = $(element_str); 

    var parseData = function (dataX) { 

     //instead of trying to return the value from the server, we just set the text of the element passed in 
     $element.text(dataX); 
    }; 

    if (localStorage.hasOwnProperty('someKey')) { 

     //here we manually call the `parseData` function to add the locally stored string to the DOM 
     parseData(localStorage.getItem('someKey')); 
    else { 

     //here we pass the `parseData` function as the callback function for this AJAX call so it can set the text in the DOM when the AJAX function has come back successfully 
     $.getJSON('http://somewhere.api.com?fubar=good', parseData); 
    } 

}; 
+0

bar()には条件付きの戻り値がありました: 'return localStorage.getItem( 'someKey');' .text()は簡単な例です。私はdataXをfoo()に戻してfoo()が他のものを実行する必要があるので、単にその要素を渡すことはできません。 (foo()は私用モジュールのコンストラクタの中にあり、このようにして、すべてのfoo()はbar()がそうしない関数を再実装する必要があります。 – BrianFreud

+0

@BrianFreud - 可能ですが、 '$ .getJSON'の完全なメソッド(' parseData')は要求が完了するまで実行されません。これは、関数が '.text( ) 'メソッドを呼び出します。 –

+0

はい、問題は、どのようにしてbar()を永続化させるか、少なくともgetJSONリクエストが完了するまでfoo()を待ちますか?それとも、getJSONリクエストを同期させるための唯一の方法でしょうか? – BrianFreud

0

これは、あなたが要求同期を行うことができ、その場合にはサポートのCORSを、要求しているサーバーがない限り、非同期であること要求することが可能であることを行っていません。私はそれが原因で発生するかもしれない悪いブラウザの経験のためにそれを行うことをお勧めしません。

barは、完了時にアクションを実行するために使用できるコールバックを受け入れることをお勧めします。

編集:ブラウザがのlocalStorageをサポートしていないとどうなります

var foo = function() { 

    $('body').text(bar()); 

}; 

var bar = function() { 

    var parseData = function (dataX) { 
     // do something to data 
     localStorage.setItem('someKey',dataX); 
     foo(); 
    }; 

    if (localStorage.hasOwnProperty('someKey')) { 
     return localStorage.getItem('someKey'); 
    else { 
     $.getJSON('http://somewhere.api.com?fubar=good', parseData); 
     return "loading..."; 
    } 

}; 

これを試してみてください?またはこれらのブラウザをターゲットにしていないだけですか?

+0

私はそれを考えていましたが、それを働かせることはできませんでした。 foo()はグローバル関数で、bar()はコンストラクタ内のプライベート関数です。コンストラクタはイベントを設定し、イベントがトリガされると、イベントのコールバックとしてfoo()が呼び出されます。 foo()はイベントによってbar()への参照を渡されます。 (したがって、コンストラクタは外部関数を呼び出して、外部関数がコンストラクタ内でプライベート関数を呼び出せるように参照を渡します) – BrianFreud

+0

parseData()内からbar()を呼び出すことはafaikからは機能していないようですbar()にアクセスする - parseData()はbar()に戻ることができますが、bar()を呼び出そうとすると期待された関数が見つかりません。 – BrianFreud

+0

はい、私はそれらを対象としていません。これは、Chrome、FF、OperaのHTML5/localStorage互換バージョンのみを対象とした大規模なGMスクリプトの小さな部分です。 – BrianFreud

関連する問題