0

JSONP リクエストと、それらを同期的に行うことができないという事実について、多くの質問があります。ほとんどの回避策には、コールバック、または ajax リクエストで成功関数を使用して必要なことを行うことが含まれますが、それがうまくいくとは思いません。

背景: Solrを使用して検索アプリケーションに取り組んでいます。私は、他の人が Solr と対話するために使用する JavaScript API を開発しているので、Solr 検索要求の内外を理解する必要はありません。

私の API には、doRequest という関数を持つ Request オブジェクトがあります。この関数の目的は、solr サーバー (別のドメイン上にあるため、JSONP が必要) への呼び出しを実行し、Response オブジェクトを返すことです。

Request.prototype.doRequest = function (){
var res = new Response();
$.ajax({
    url: this.baseURL,
    data: 'q=*:*&start=0&rows=10&indent=on&wt=json', 
    success: function(data){
        res.response = data.response;
        res.responseHeader = data.responseHeader;
        /*
          other...
          stuff...
        */
    },
    dataType: 'jsonp',
    jsonp: 'json.wrf'
});
res.request = this;
return res;
};

「ユーザー」はこの機能を次のように使用します...

var req = new Request();
var res = req.doRequest();

次に、結果を res にして何かを行います。

同期JSONPリクエストを実行できず、ajax関数内から戻ることができないため、ユーザーが使用を開始する前に res が完全に入力されていることを確認することはできません。

ありがとう、

4

2 に答える 2

0

コールバック関数を使用することがこれを行う方法のようです。あなたが興味を持っている場合に備えて、これが私がそれをやった方法です。

Request.prototype.doRequest = function (callback){
var res = new Response();
$.ajax({
    url: this.baseURL,
    data: 'q=*:*&start=0&rows=10&indent=on&wt=json', 
    success: function(data){
        res.response = data.response;
        res.responseHeader = data.responseHeader;
        res.request = this;
        /*
          other...
          stuff...
        */
        callback(res);
    },
    dataType: 'jsonp',
    jsonp: 'json.wrf'
});
};

そして今、ユーザーは次のように関数を使用します:

var req = new Request();
var res = req.doRequest(parseResults);

parseResults は、応答オブジェクトをパラメーターとして受け取る、ユーザーによって定義されたコールバック関数です。

function parseResults(res){
    //Doing work
}
于 2013-02-25T20:50:31.713 に答える
0

プログラムの残りの部分が同期的であるかどうかにかかわらず、REST インターフェースを同期的に操作する必要がある場合があります。例としては、アセット (おそらくアセット ID) の配列を取得するリクエストがあり、各 ID をハイドレートして完全なデータ/アセットを取得する場合があります。Ooyala API を使用したことがあれば、私の言いたいことがわかるでしょう。

最初の同期 JSONP モジュールと思われるものを作成して、次の各リクエストが前のリクエストの完了後にのみ実行されるようにしました。Promise の代わりに再帰を使用します。つまり、前のリクエストが成功するまで次のリクエストは送信されません。API はここにあります: https://github.com/cScarlson/jsonpsync

お役に立てれば。

于 2013-10-29T03:53:42.480 に答える