0

現在、jQuery で同期 AJAX 呼び出しを行っています。非同期呼び出しを維持しながら、親関数が Ajax 応答を返す方法はありますか。私が見つけた唯一の解決策は、コールバック関数を使用することでした。このオブジェクトを変数に入れるつもりなので、コールバック関数を書きたくありません。

例えば

var ajax = serviceinterface.rawServiceCall(“http://user.myservice.com/endpoint”, “post”, {name : “xyz”});

こんな使い方もいいかもしれません

$.when(serviceinterface.rawServiceCall(endpoint1, “get”), serviceinterface.rawSCACall(endpoint2, ‘get’)).done(function(){
    // do something here
});

これが私の関数コードです。同期呼び出しはまったく問題なく動作しますが、非同期呼び出しを行いたいです。

rawServiceCall : function(endpoint, type, payload) {
                     type = typeof type !== 'undefined' ? type : "get";
                     payload = typeof type !== 'undefined' ? payload : null;

                     return $.ajax({
                           url : endpoint,
                           type : type,
                           data : payload,
                           async : false,
                           dataType : 'json',
                           headers: {
                                 accept : "application/json"
                           },
                           success : function(data){
                                 return data;
                           }
                    });

              }

PS - CPU サイクルを無駄にしたり、Web ページの他の部分が最初に読み込まれるまで待機したりしたくありません。または、これに対するより良いアプローチは何ですか?

4

2 に答える 2

0

簡単な答えはノーです。動作は完全に同期または完全に非同期になります。

しかし、あなたのコードはあなたが求めている解決策の99%であるため、問題はないと思います。dataコールバックで返されたものを評価する方法を知る必要があり.done()ます。

答えは、コールバックがajaxオプションとして定義され.done()たコールバックの引数と同じ引数を取るということです。、および。successdatatextStatusjqXHR

rawServiceCall: function(endpoint, type, payload) {
    type = type || "get";
    payload = payload || null;
    return $.ajax({
        url: endpoint,
        type: type,
        data: payload,
        async: false,
        dataType: 'json',
        headers: {
            accept: "application/json"
        }
    });
}

serviceinterface.rawServiceCall(endpoint1).done(function(data, textStatus, jqXHR) {
    //do something here
});

$.when(serviceinterface.rawServiceCall(endpoint1), serviceinterface.rawServiceCall(endpoint2)).done(function(data, textStatus, jqXHR) {
    // do something here
});

同じことがコールバックにも当てはまりerrorますcomplete。したがって、jQuery.ajaxpromiseに相当するコールバックの完全なリストは次のとおりです。

  • .done(function(data, textStatus, jqXHR){...})と同等ですsuccess: function(data, textStatus, jqXHR){...}

  • .fail(function(jqXHR, textStatus, errorThrown){...})と同等ですerror: function(jqXHR, textStatus, errorThrown){...}

  • .always(function((jqXHR, textStatus){...})と同等ですcomplete: function((jqXHR, textStatus){...}

すべてのjQuerypromiseオブジェクトには.done().fail()メソッド.always()がありますが、これらのメソッドのコールバック(存在する場合)によって取得される引数は、元のDeferred(promiseの派生元)が解決/拒否されたときに渡されるものによって異なります。

于 2012-12-21T09:14:52.193 に答える
0

CPU サイクルを浪費することなく、JavaScript で非同期メソッドを同期メソッドに変換することはできません。

コードの実行を停止する唯一の方法は、alert() を使用することです。JS では、あなたは決して眠らず、ただ遊んでいるだけです。

于 2012-12-21T10:08:07.960 に答える