window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
return "You are logged out.";
Logout();
}
};
logout()
returnステートメントの後に関数を呼び出したいのですが、可能ですか?
window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
return "You are logged out.";
Logout();
}
};
logout()
returnステートメントの後に関数を呼び出したいのですが、可能ですか?
returnステートメントの後には何も実行できません。
編集:ステートメントは、クリーンアップの目的でfinally
後のコード実行を許可します。return
(これはXYの良い例です-質問:あなたはYについて質問していますが、実際に必要なXについては決して教えてくれません)。
returnステートメントは関数を終了し、その後にコードを実行することはできません。あなたはこれを行うことができます:
ret = "You are logged out.";
Logout();
return ret;
必要なのは、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."
、それはあなたのアプリケーションです。
あけましておめでとう。乾杯!
一般に、関数が戻った後に何かを実行したい場合は、タイマーを設定できます。
function myFunction() {
if (document.getElementById("parentpan").style.display == "block") {
setTimeout(Logout, 50); // Logout will be called 50ms later
return "You are logged out.";
}
};
ただし、コメントに記載されているように、ページのアンロードが最初に終了した場合はタイマーイベントが発生しないため、これはonbeforeunloadには適していません。
他の回答者のほとんどは、あなたがここでやろうとしていることを見逃しています。window.onbeforeunload
のように振る舞いたいwindow.confirm()
。onbeforeunload イベントで ok アクションを実行する方法はありません。
アクションを実行するには、onunload に接続する必要があります。
window.onbeforeunload = function () {
return "Your session will be logged out"
};
window.onunload = function () {
logout();
}
これに関する問題は、現代のブラウザーが unload/beforeunload で実行される多くのプロセスを強制終了してブラウザーを「高速化」し、高速化することです。したがって、非同期の場合、競合状態になります。
returnは、呼び出された関数の実行から戻っていることを意味します。returnステートメントが実行されると、システムは関数の実行が終了したことを認識し、関数が呼び出されたメインプログラムに切り替わります。
プログラムでは、帰国後の声明を見ることができますが、システムはそれをチェックしません。
プロジェクトに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");
});
これにアプローチする2つの方法を見つけました。最初のものは、上記のBhavsar Japanによって述べられたとおりです
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()
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();
ログアウトは時間のかかるプロセスであり、実行する前にユーザーにフィードバックを提供したいと思います。
setTimeout(Logout,1);
return "You are logged out.";