0

コントロールはデータ サービスを呼び出し、JS結果を待たずにレンダリングを続行します。コントロールが完全にレンダリングされた後にサービスが返されることもあれば、その前に返されることもあります。でどのように実装WaitForAllJSますか? を使用してjQueryいます。

これが私が自分で行ったことです:(Utils.WaitForAllは、ハンドルを呼び出すカウントと一致すると、ヒット数をカウントするだけです)

// before we started
var waiter = Utils.WaitFor({handle: function(e){ alert("got called"; }, count: 2});

トリガーされる方法:

// place one
waiter.Notify({one: {...}});

その後

// place two (can occur before one though)
waiter.Notify({two: {...}});

これはハンドルをトリガーし、ハンドルにはone&としてタグ付けされた値が含まれtwoていますe。Waiter は追加の「グローバル」変数であり、スタックを下って移動しますが、これはあまり好きではなく、結局のところ別の新しいオブジェクトです...私のアプローチに明らかな問題はありますか?

4

2 に答える 2

3

この場合に使用できるプログレスコールバックを提供する CommonJS ( jQuery.Deferredによって実装) の promise インターフェイスを確認する必要があります。

サンプルコード:

var waiter = $.Deferred();
var len = 2;
waiter.done(function() {
   alert("Hooray!!!");
});
waiter.progress(function() {
    if(--len === 0) {
        waiter.resolve();
    }
});
// somewhere
$.ajax({
    ...
    data: somedata,
    success: function() {
        waiter.notify();
    }
});
// somewhere else
$.ajax({
    ...
    data: someotherdata,
    success: function() {
        waiter.notify();
    }
});

遅延についての詳細:

于 2013-05-13T14:59:41.340 に答える