質問: Jquery-jsonpプラグインと遅延オブジェクト(遅延しない) 私はjQuery遅延オブジェクトとjQuery-jsonpプラグインを使用しようとしていますが、これまで運がないです。 目標は、APIを呼び出して、データを取得し、それらを精緻化することです。さまざまな目的のために同じ呼び出しを使用してさまざまなデータセットを検索していますので、このようにしてコードを構造化して、それぞれの洗練された関数で同じAPI呼び出しを明示的に繰り返さないようにしました。 ``` function callAPI(){ return $getJSON(url); } function doStuff1(){ $.when(callAPI) .then(function(data){ //get the data and elaborate them for purpose #1 }) } function doStuff2(){ $.when(callAPI) .then(function(data){ //get a different set of data from same API //and elaborate them for purpose #2 }) } ``` 問題は、Julian Aubourgのプラグインから$ .jsonp()を$ .getJSON()に置き換えて同じ手法を試してみました( http://code.google.com/p/jquery-jsonp/ )、延期は機能しません。 私はこれにいくつかの制限があり、それらを変更することはできません: * API呼び出しはJSONPを使用する必要があります。 *私はエラーを検出することができなければなりません(どんな種類であっても)、jQuery-jsonpプラグインを使用しています。 私はjQuery Deferred Object、jQueryフォーラム、Stackoverflow、Webの深みを調べ、プラグインページのすべてを読んでいました。私はいくつかのアプローチを試みましたが、これまでには何も働いていませんでした。 私の仮説は、その構造(jquery-jsonpプラグインはエラーを捕捉することができる)のために遅延関数が動作しないということです。$ .jsonpは$ .ajaxのような遅延自体ではありませんが、私はこの素晴らしいコミュニティからアドバイスが必要です。 私が見つけた1つの解決策は、私のために機能します。関数をcallAPI関数のパラメータとして渡すことです。成功すると、自分自身を繰り返さずに必要なものを実行できます。 したがって、私のcallAPI関数は次のように変更されます: ``` function callAPI(func){ $.jsonp({ "url": url, "success": function(data) { func(); }, "error": function(d,msg) { //show error message } }) } callAPI(doStuff1); //or callAPI(doStuff2); ``` しかし、エラー管理の必要性が開発段階の後半に出てきたので、私は初心者であると思っていませんでした。これは、コード全体を書き直すことを意味します。だから誰かがjquery-jsonpプラグインで遅延を使用することができたら、それは知っていると素晴らしいだろう。 皆さん、ありがとうございました。 フラビア
回答: 私はこれがあなたが望むものだと思います。 jQuery-jsonpの内部APIを遅延オブジェクトの呼び出しメソッドにマップする必要があります。 ``` function callAPI(url){ return $.Deferred(function(dfd) { $.jsonp({ url: url ,success: dfd.resolve ,error: dfd.reject ,complete: dfd.always }); }).promise(); } ``` それから、あなたは ``` $.when(callAPI('url #1'), callAPI('url #2')) .done(function(response1, response2) { //each response will be [ json , STR_SUCCESS ] based on Jquery-jsonp's API var json1 = response1[0]; ... }) .error(function(error1, error2) { //each response will be [ xOptions , type ] based on Jquery-jsonp's API ... }) ; ```