oRes
にプライマリソース(getData1()
)から来る可能性がある場合にのみ実行するイベントハンドラを$someEl
にバインドしました。 )またはバックアップ元(getData2()
)。プライマリソースがタイムアウトした場合にのみ、バックアップソースからデータが要求されます。
プライマリソースがタイムアウトしない場合、すべてが機能します。ただし、バックアップgetData2()
関数が呼び出されると、dfd
は解決されないため、$someEl
をクリックするとログに記録されることはありません。 getData2()
のDeferredオブジェクトが$someEl
クリックハンドラが参照している変数dfd
を上書きしているため、動作していないと思われます。
私は「ベストプラクティス」パターンを使用してDeferred/Promiseを適用していないと感じています。このシナリオでは、タイムアウト後にクリックハンドラがプライマリAJAXレスポンスまたはセカンダリAJAXレスポンスのいずれかからoResが移入されるのを適切に待つようにしますか?
明確化のためのいくつかの注意は:
getData1()
は、文書は、文書のロード時にいつでも発射するので、イベントハンドラは$(document).ready()
の外で定義する必要があり
- 準備ができているだけで後に実行する必要があります
- 私はここでのjQuery 1.7.1
$someEl.click()
とこだわっているコードです:
var oRes, dfd;
// Get data from primary source
function getData1() {
dfd = $.ajax({
...
success: function(data) {
oRes = data;
},
error: function(jqXHR, textStatus, errorThrown) {
if (textStatus==='timeout') getData2();
},
timeout: 10000 // 10-second timeout
});
}
// Get data from backup source
function getData2() {
dfd = $.ajax({...});
}
$someEl.click(function() {
dfd.done(function() {
console.log('This should only log when oRes is ready');
});
});
$(document).ready(function() {
getData1();
});
私はこのペンで私の状況をシミュレートしました。基本的にhttp://codepen.io/thdoan/pen/pyVyKj
、私が出力するイベントハンドラを取得し、トラブルを抱えている「データが準備ができています!」 oRes
が入力されたときに、ページがロードされた後に手動でボックスをクリックする必要はありません。
はちょうどあなたの現在の戦略では、$ someElがクリックされるたびに、それは繰延オブジェクトに別のコールバックを結合することを指摘したかったので、とき最終的に遅延が解決され、コールバックがX回実行されます.Xは要素がクリックされた回数です。これはあなたが望む行動かもしれませんが、あなたが気づいていることを確認したかっただけです。 –
@MattDiamondそれを指摘してくれてありがとう、非常に良い点:)。代わりに '.one( 'click'、...)'を使うようにコードを変更しました。 – 10basetom