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の結果が添付されています。
私の質問をより適切に表現できるかどうか教えてください。親指を下げ続けます。
また、私のコードを改善できるかどうか知りたいのですが、リターンが独立していない理由を本当に探しています。
前もって感謝します。
オブジェクトはJavascriptのポインターによって渡されるため、それを呼び出しme.getAjaxOptions()
てajax呼び出しに渡すと、まったく同じajaxOptions
オブジェクトが両方のajax呼び出しに渡されます。コピーは作成されません。まったく同じオブジェクトです。したがって、戻り結果をそのオブジェクトに入れるので、2番目のajax呼び出しは最初のajax呼び出しの結果を上書きします。
このコードでの設計手法の多くが、問題の原因となっています。まず、結果を受け取る関数によって作成された新しいオブジェクトで結果を返す場合は、この問題全体を回避できます。その場合、1回の呼び出しの結果が、前の呼び出しの結果を上書きする機会はありません。
また、既存のコールバックシステムの上に新しいコールバックシステムを設計しないことを強くお勧めします。本当に理由はありません。私の一番の推奨事項は、jQueryがAjax呼び出しのような非同期操作からの結果を通信するための豊富に設計されたシステムであるため、ajax呼び出しごとにすでに返されるPromiseを使用することです。
また、新しいコールバックシステムを設計する場合、プロパティ名でコールバックを文字列として渡すのは非常に奇妙で、実際には必要ありません。コールバックは、直接関数参照として渡すことができます。
参考までに、jQueryがあるので、$.extend()
この問題を回避するためにオブジェクトの実際のコピーを作成するために使用できますが、これは「最新」と見なされるため、非同期結果を返すために組み込みのpromiseシステムを使用する再設計をお勧めします"そして非同期操作を処理するためのより有能な方法(ES6で標準になります-jQueryにすでにある機能)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加