基本的に次のような関数があります。
function defTest()
{
var dfd = new jQuery.Deferred();
$.ajax(
{
type: "GET",
url: 'http://XXXX',
cache: false,
dataType: "json",
success: function(data,status)
{
console.log('ajax done: success');
dfd.resolve();
},
error: function(data,status)
{
console.log('ajax done: fail');
dfd.reject();
}
});
console.log('about to return dfd');
return dfd;
}
私はそれをこのように呼びます:
defTest().then(.....);
コンソールログはこれを生成します:dfd code.js:106 ajax doneを返します:success code.js:96
私を混乱させるのは、コードが機能しているように見えることです。それでも、ajaxが終了する前にdfdが返されます。だから私はリターンdfdを削除しました。そして、それを各ajaxハンドラー関数の最後に配置して、Ajaxが終了するまでこれが返されないようにします。
success: function(data,status)
{
console.log('ajax done: success');
dfd.resolve();
return dfd;
}
その後、まったく機能しませんでした。私は混乱しています!誰かが私の延期されたオブジェクトがajaxの成功とエラーハンドラーに含まれない理由と、Ajaxが終了して解決または拒否される前に、延期されたオブジェクトが起動されても返されるように見えるのに、なぜそれが機能するのかを説明できますか?どうしてそれも可能ですか?
編集:この問題は、以前の未回答のより複雑な関数に直接関連しています: 遅延オブジェクトの問題
これが、私の実際の関数には、呼び出し元に返される1つの結果の一部となる他のajax呼び出しが含まれているため、単に「ajax(...)を返す」ことができない理由です。