10

いくつかの ASP.NET UpdatePanels があり、それぞれに AsyncPostBackTrigger が同じボタンのサーバー側クリック イベントに関連付けられています。一度に実行できる UpdatePanel は 1 つだけなので、 を使用.get_isInAsyncPostBack()してPageRequestManager、非同期ポストバックが完了するまでユーザーがページの別の部分にアクセスできないようにします。

このページの別の部分では、複数の更新パネルを連続して動的に更新する必要があります。更新パネルは非同期トリガーを使用するため、呼び出しは非同期で起動します__doPostBack("<%=ButtonName.ClientID %>", 'PanelId');。このため、ループの次の反復にすばやく移動し、次のパネルを更新しようとします。ただし、非同期ポストバックを実行している別の更新パネルが既に存在するため、2 回目の反復は失敗します。

.get_isInAsyncPostBack()理想的には、他のクライアント アクティビティをブロックせずに、false が返されるまで待機する方法があります。

調査の結果、私の問題を抱えている多くの人々が見つかりました。ほとんどすべての人が を使用するように勧められていますsetTimeOut()。これがうまくいくとは思いません。関数を実行する前に、指定された時間待ちたくありません。別のスクリプトが実行されている間、できれば特定の条件が真になるまで待機するだけです。

おそらく多くの人が、私のモデルを再考するよう提案したいと思うでしょう。これは実際には私のモデルではありませんが、開発チームに渡されたモデルであり、現在内部で完全に混乱しています。時間の制約により、モデルを書き直すことはできません。唯一のオプションは、これを機能させることです。クライアント コードをブロックせずに待機させる方法があれば、問題は解決すると思います。

4

4 に答える 4

35

ブラウザが応答しなくなるため、JavaScript には待機やスリープなどの機能はありません。

あなたの場合、私は次のようなものに行きます:

function wait(){
  if (!condition){
    setTimeout(wait,100);
  } else {
    // CODE GOES IN HERE
  }
}
于 2012-10-11T14:20:08.770 に答える
2

この関数は、条件が満たされたときに true を返す condFunc を呼び出します。それが起こると、readyFunc が呼び出されます。checkInterval は、チェック率をミリ秒単位で設定します

       var wait = function(condFunc, readyFunc, checkInterval) {
            var checkFunc = function() {
                if(condFunc()) {
                    readyFunc(); 
                }
                else
                {
                    setTimeout(checkFunc, checkInterval);
                }
            };
            checkFunc();
        };

使用法:

       wait(
            function() { return new Date().getSeconds() == 10; }, 
            function() { console.log("Done"); },
            100
        );

現在の時刻が分後 10 秒の場合、「完了」と出力します

于 2015-02-01T23:48:52.463 に答える