0

jQuery Deferred Objectsで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のプラグイン( http://code.google.com/p/jquery-jsonp/ )の$ .getJSON()を$ .jsonp()に置き換えて同じアプローチを試しましたが、延期が機能しないことです。

これにはいくつかの制限があり、変更できません。

*API呼び出しはJSONPを使用する必要があります。

*エラーを検出できる必要があります(種類に関係なく)。したがって、これまでに見つけた唯一のソリューションであるjQuery-jsonpプラグインを使用します。

私はjQueryDeferredObjectを研究し、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プラグインで遅延を使用することに成功した場合、それを知っておくとよいでしょう。

皆さん、ありがとうございました。

フラビア

4

1 に答える 1

1

これがあなたの望むものだと思います。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
    ...
  })
;
于 2012-03-09T13:35:47.783 に答える