8
window.onbeforeunload = function() {
    if (document.getElementById("parentpan").style.display == "block") {
        return "You are logged out.";
            Logout();
    }
};

logout()returnステートメントの後に関数を呼び出したいのですが、可能ですか?

4

12 に答える 12

12

returnステートメントの後には何も実行できません。

編集:ステートメントは、クリーンアップの目的でfinally後のコード実行を許可します。return

(これはXYの良い例です-質問:あなたはYについて質問していますが、実際に必要なXについては決して教えてくれません)。

于 2012-12-31T14:44:05.337 に答える
7

returnステートメントは関数を終了し、その後にコードを実行することはできません。あなたはこれを行うことができます:

ret = "You are logged out.";
Logout();
return ret;
于 2012-12-31T14:44:57.823 に答える
6

必要なのは、Logout非同期で実行することです。setTimeoutこれは、他の人が言ったように関数を使用することで、JavaScript で簡単に実現できます。関数を非同期で呼び出すためによく使用する方法を次に示します。

Function.prototype.async = function () {
    setTimeout.bind(null, this, 0).apply(null, arguments);
};

このメソッドは、関数呼び出しをすぐに (0ミリ秒後) イベント ループにプッシュします。したがって、関数は現在のコードが完了した後に実行されます (これは、戻った後です)。これを使用する方法の簡単な例を次に示します。

alert.async("This will be displayed later.");
alert("This will be displayed first.");

最初のalert呼び出しは非同期で呼び出されるため、2 番目の への呼び出しの後に実行されalertます。関数呼び出しの前に を付けるだけasyncです。これはあなたの場合にあなたがすることです:

window.onbeforeunload = function () {
    if (document.getElementById("parentpan").style.display === "block") {
        Logout.async();
        return "You are logged out.";
    }
};

欠点は何ですか?関数はイベント ループでブロックされるため、実行する機会が得られない可能性があります (したがって、ユーザーはログアウトしません)。このような状況発生する可能性があります。これは通常、コントロールが無限ループに入るか、AJAX 要求のブロックが原因でハングした場合に発生します。

ただし、これは非常にまれなケースです。だから心配しないでください。他の人があなたをからかっているのと同じように使用するsetTimeoutだけで、うまくいくでしょう。個人的には、メッセージを返す前にログアウトする必要があると思いますが"You are logged out."、それはあなたのアプリケーションです。

あけましておめでとう。乾杯!

于 2012-12-31T15:04:22.423 に答える
1

一般に、関数が戻った後に何かを実行したい場合は、タイマーを設定できます。

function myFunction() {
    if (document.getElementById("parentpan").style.display == "block") {
        setTimeout(Logout, 50); // Logout will be called 50ms later
        return "You are logged out.";
    }
};

ただし、コメントに記載されているように、ページのアンロードが最初に終了した場合はタイマーイベントが発生しないため、これはonbeforeunloadには適していません。

于 2012-12-31T14:50:20.783 に答える
1

他の回答者のほとんどは、あなたがここでやろうとしていることを見逃しています。window.onbeforeunloadのように振る舞いたいwindow.confirm()。onbeforeunload イベントで ok アクションを実行する方法はありません。

アクションを実行するには、onunload に接続する必要があります。

window.onbeforeunload = function () { 
    return "Your session will be logged out" 
};
window.onunload = function () { 
    logout(); 
}

これに関する問題は、現代のブラウザーが unload/beforeunload で実行される多くのプロセスを強制終了してブラウザーを「高速化」し、高速化することです。したがって、非同期の場合、競合状態になります。

于 2012-12-31T15:10:11.600 に答える
0

returnは、呼び出された関数の実行から戻っていることを意味します。returnステートメントが実行されると、システムは関数の実行が終了したことを認識し、関数が呼び出されたメインプログラムに切り替わります。

プログラムでは、帰国後の声明を見ることができますが、システムはそれをチェックしません。

于 2012-12-31T14:51:08.847 に答える
0

プロジェクトにjqueryがある場合は、遅延メカニズムを使用できます。次のような進行中のタスクの promise オブジェクトを返すことができます。

function task() {

   var defered = $.Deferred();
   setTimeout(defered.resolve , 5000);
   return defered.promise();

}  

function task2() {

   var defered = $.Deferred();
   setTimeout(defered.resolve , 10000);
   return defered.promise();
}   

function run() {
     return $.when(task(),task2());
}

var promise = run();

promise.done(function(){        
      alert("All tasks has been completed");        
});

デモ

于 2012-12-31T15:14:19.740 に答える
0

これにアプローチする2つの方法を見つけました。最初のものは、上記のBhavsar Japanによって述べられたとおりです

1. 使用例try, catch and finally

const example1 = () => {
  try {
    return console.log('will execute first')
  } finally{
    console.log('will execute second')
  }
  return 'will never execute'
}

const main = () => {
  const message = example1();
  console.log(message)
}

main()

2. 使用例Promise.resolve

const example2 = () => {
  Promise.resolve()
    .then(() => console.log('will execute after return'));
  return 'will execute first'

}

const main = () => {
  const message = example2();
  console.log(message);
}

main();

于 2021-05-05T11:39:59.013 に答える
-1

ログアウトは時間のかかるプロセスであり、実行する前にユーザーにフィードバックを提供したいと思います。

setTimeout(Logout,1);
return "You are logged out.";
于 2012-12-31T14:50:52.793 に答える