異なるオブジェクトを渡すと、AJAXが同じデータをコールバックに返すのはなぜですか?

キリレア

MVCコントローラーに対して2つの異なる呼び出しを行おうとしています。1つ目は一連のデータを返し、2つ目は部分ビューを返します。Firebugでは、結果が表示され、ステータスは両方で「成功」です。

結果を処理するためのコールバックを一般的なAJAXメソッドに渡そうとしています。1つ目はdataType'Json "、2つ目はdataType'HTML 'です。繰り返しますが、個別に起動すると両方とも機能しますが、2回目の呼び出しで互いに上書きしているように見えます。

オブジェクト内にすべて追加されるグローバルパラメータは次のとおりです。

var ajaxOptions = {
    data: '',
    params: {},
    callback: "ajaxafter",
    url: "",
    ishtml: false,
    tag: 0,
    success: false
};

...
    //  get ajax options
me.getAjaxOptions = function () {
    return ajaxOptions;
}

p.AJAX = (function ($, me) {
    'use strict';
    var child = {};

    function returnAJAXDefault(o) {
        var dataType = (o.ishtml) ? "html" : "json";

        $.ajax({
            url: o.url,
            data: JSON.stringify(o.params),
            type: 'POST',
            dataType: dataType,
            contentType: 'application/json; charset=utf-8'         
        }).done(function (data) {
            o.data = data;
            o.success = true;

            console.dir(o)
            if (o.callback !== null && me[o.callback]) {
                me[o.callback](o);
                return;
            }
        }).fail(function (jqXhR) {
            o.data = jqXhR;
            if (o.callback !== null && me[o.callback]) {
                me[o.callback](o);
                return;
            }
        });
    }

    //  get ajax
    child.getAJAX = function (options) {
        returnAJAXDefault(options);
    }

    return child;

}(jQuery, obj));

これは私のajax呼び出しです。

このページで私はこれを試してみます。

$(document).ready(function () {

    p = (function ($, me) {
        me.ajaxafter = function (data) {
            console.log(1)
            if (data.tag == 1) {
                $('body').html(data.data)
            }

            if (data.tag == 0) {
                console.dir(data.data);
            }
        }

        me.ajaxafter1 = function (data) {
            console.log(2)
            if (data.tag == 1) {
                $('body').html(data.data)
            }

            if (data.tag == 0) {
                console.dir(data.data);
            }
        }

        function test1() {
            var axopts = me.getAjaxOptions();
            axopts.params = {
                varinput: 'tst'
            };
            axopts.url = "/Common/ReturnProjectList";
            axopts.callback = "ajaxafter";
            me.AJAX.getAJAX(axopts);

        }

        function test2() {
            var axopts1 = me.getAjaxOptions();
            axopts1.url = "/Common/ReturnPartial";
            axopts1.ishtml = true;
            axopts1.tag = 1;
            axopts1.callback = "ajaxafter1";
            me.AJAX.getAJAX(axopts1);

        }

        test1();
        test2();

    }(jQuery, obj));

});

Firebugの結果が添付されています。

私の質問をより適切に表現できるかどうか教えてください。親指を下げ続けます。

また、私のコードを改善できるかどうか知りたいのですが、リターンが独立していない理由を本当に探しています。

前もって感謝します。

jfriend00

オブジェクトはJavascriptのポインターによって渡されるため、それを呼び出しme.getAjaxOptions()てajax呼び出しに渡すと、まったく同じajaxOptionsオブジェクトが両方のajax呼び出しに渡されますコピーは作成されません。まったく同じオブジェクトです。したがって、戻り結果をそのオブジェクトに入れるので、2番目のajax呼び出しは最初のajax呼び出しの結果を上書きします。

このコードでの設計手法の多くが、問題の原因となっています。まず、結果を受け取る関数によって作成された新しいオブジェクトで結果を返す場合は、この問題全体を回避できます。その場合、1回の呼び出しの結果が、前の呼び出しの結果を上書きする機会はありません。

また、既存のコールバックシステムの上に新しいコールバックシステムを設計しないことを強くお勧めします。本当に理由はありません。私の一番の推奨事項は、jQueryがAjax呼び出しのような非同期操作からの結果を通信するための豊富に設計されたシステムであるため、ajax呼び出しごとにすでに返されるPromiseを使用することです。

また、新しいコールバックシステムを設計する場合、プロパティ名でコールバックを文字列として渡すのは非常に奇妙で、実際には必要ありません。コールバックは、直接関数参照として渡すことができます。

参考までに、jQueryがあるので、$.extend()この問題を回避するためにオブジェクトの実際のコピーを作成するために使用できますが、これは「最新」と見なされるため、非同期結果を返すために組み込みのpromiseシステムを使用する再設計をお勧めします"そして非同期操作を処理するためのより有能な方法(ES6で標準になります-jQueryにすでにある機能)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じレコードをクエリするときにActiveRecordが異なるrubyオブジェクトを作成するのはなぜですか?

分類Dev

GetDCが同じオブジェクトに対して異なる値を返すのはなぜですか?

分類Dev

2つの異なるオブジェクトを同じオブジェクトにデコードするのに、boolメンバーが変更されていないのはなぜですか?

分類Dev

(オブジェクトスコープ外の)変数をオブジェクトメソッドと同じに設定すると、未定義の結果が返されるのはなぜですか?

分類Dev

値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

分類Dev

値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

分類Dev

MS AJAX PageMethodsを使用してオブジェクトを渡そうとすると、パラメータがnullになるのはなぜですか

分類Dev

コンパレータオブジェクトをsortメソッドに渡すことができるのはなぜですか?

分類Dev

同じタイプ/クラスのオブジェクトが異なるデータ属性を持つことは可能ですか?

分類Dev

ループで作成するオブジェクトが同じになるのはなぜですか?

分類Dev

オブジェクトをハッシュテーブルのキーとして使用したくないのに、2つの等しいオブジェクトが等しいハッシュコードを返す必要があるのはなぜですか?

分類Dev

StringFormatを使用したマルチバインディング-内部コンバーターにtargetType ==オブジェクトがあるのはなぜですか?

分類Dev

hashCode()がJavaの異なるオブジェクトに対して同じ値を返すのはなぜですか?

分類Dev

AJAXを介してデータを送信するときに、オブジェクトをJSON.stringify()する必要があるのはなぜですか?

分類Dev

特性とオブジェクトの名前を同じにする必要があるのはなぜですか。

分類Dev

私の場合、unordered_multimapで異なるオブジェクトが同じハッシュコード値を持つようにequalメソッドをオーバーロードするにはどうすればよいですか?

分類Dev

オブジェクトメソッドを反復処理するときに、for(... in ...)ループがキーを返さないのはなぜですか

分類Dev

子オブジェクトのリストを含むモデルをコントローラーに渡すときに、子オブジェクトのリストが渡されないのはなぜですか?

分類Dev

オブジェクトを含む同じコードが機能するのに、オブジェクトを含むコードがコンパイルに失敗するのはなぜですか?

分類Dev

同じオブジェクトを指す2つのオブジェクトインスタンスの1つが、それらのいずれかにNULLを割り当てると、異なる動作をするのはなぜですか?

分類Dev

選択クエリでバッククォートを使用すると、SQLクエリがテーブルデータを返すのはなぜですか?

分類Dev

同じオブジェクトを参照する値が異なる2つのポインターを持つことは未定義の動作ですか?

分類Dev

ポインタとして渡されたときにオブジェクトがスコープ外になるのに、返されたときにオブジェクトがスコープ外になるのはなぜですか

分類Dev

$( 'selector')。findが$ .find( 'selector')と同じオブジェクトを返さないのはなぜですか?

分類Dev

オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

分類Dev

同じオブジェクトの異なるインスタンスを作成し、Koinのget()関数にパラメーターを渡すことでそれらにアクセスすることは可能ですか?

分類Dev

同じJSONオブジェクト内の異なるNodaTimeLocalDateパターンを逆シリアル化するにはどうすればよいですか

分類Dev

オブジェクトがJSONオブジェクトとArrayオブジェクトの場合、[For .. in]ループで使用される変数が異なる値を返すのはなぜですか?

分類Dev

同じオブジェクトの異なるメソッドが同じ `id`を持っているのはなぜですか?

Related 関連記事

  1. 1

    同じレコードをクエリするときにActiveRecordが異なるrubyオブジェクトを作成するのはなぜですか?

  2. 2

    GetDCが同じオブジェクトに対して異なる値を返すのはなぜですか?

  3. 3

    2つの異なるオブジェクトを同じオブジェクトにデコードするのに、boolメンバーが変更されていないのはなぜですか?

  4. 4

    (オブジェクトスコープ外の)変数をオブジェクトメソッドと同じに設定すると、未定義の結果が返されるのはなぜですか?

  5. 5

    値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

  6. 6

    値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

  7. 7

    MS AJAX PageMethodsを使用してオブジェクトを渡そうとすると、パラメータがnullになるのはなぜですか

  8. 8

    コンパレータオブジェクトをsortメソッドに渡すことができるのはなぜですか?

  9. 9

    同じタイプ/クラスのオブジェクトが異なるデータ属性を持つことは可能ですか?

  10. 10

    ループで作成するオブジェクトが同じになるのはなぜですか?

  11. 11

    オブジェクトをハッシュテーブルのキーとして使用したくないのに、2つの等しいオブジェクトが等しいハッシュコードを返す必要があるのはなぜですか?

  12. 12

    StringFormatを使用したマルチバインディング-内部コンバーターにtargetType ==オブジェクトがあるのはなぜですか?

  13. 13

    hashCode()がJavaの異なるオブジェクトに対して同じ値を返すのはなぜですか?

  14. 14

    AJAXを介してデータを送信するときに、オブジェクトをJSON.stringify()する必要があるのはなぜですか?

  15. 15

    特性とオブジェクトの名前を同じにする必要があるのはなぜですか。

  16. 16

    私の場合、unordered_multimapで異なるオブジェクトが同じハッシュコード値を持つようにequalメソッドをオーバーロードするにはどうすればよいですか?

  17. 17

    オブジェクトメソッドを反復処理するときに、for(... in ...)ループがキーを返さないのはなぜですか

  18. 18

    子オブジェクトのリストを含むモデルをコントローラーに渡すときに、子オブジェクトのリストが渡されないのはなぜですか?

  19. 19

    オブジェクトを含む同じコードが機能するのに、オブジェクトを含むコードがコンパイルに失敗するのはなぜですか?

  20. 20

    同じオブジェクトを指す2つのオブジェクトインスタンスの1つが、それらのいずれかにNULLを割り当てると、異なる動作をするのはなぜですか?

  21. 21

    選択クエリでバッククォートを使用すると、SQLクエリがテーブルデータを返すのはなぜですか?

  22. 22

    同じオブジェクトを参照する値が異なる2つのポインターを持つことは未定義の動作ですか?

  23. 23

    ポインタとして渡されたときにオブジェクトがスコープ外になるのに、返されたときにオブジェクトがスコープ外になるのはなぜですか

  24. 24

    $( 'selector')。findが$ .find( 'selector')と同じオブジェクトを返さないのはなぜですか?

  25. 25

    オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

  26. 26

    同じオブジェクトの異なるインスタンスを作成し、Koinのget()関数にパラメーターを渡すことでそれらにアクセスすることは可能ですか?

  27. 27

    同じJSONオブジェクト内の異なるNodaTimeLocalDateパターンを逆シリアル化するにはどうすればよいですか

  28. 28

    オブジェクトがJSONオブジェクトとArrayオブジェクトの場合、[For .. in]ループで使用される変数が異なる値を返すのはなぜですか?

  29. 29

    同じオブジェクトの異なるメソッドが同じ `id`を持っているのはなぜですか?

ホットタグ

アーカイブ