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
语句允许在 a 之后执行代码以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
此方法立即(在ms 之后)将函数调用推送到事件循环中。因此,该函数在当前代码完成后执行(对您来说是在您返回之后)。这是一个如何使用它的简单示例:
alert.async("This will be displayed later.");
alert("This will be displayed first.");
由于第一个alert
是异步调用的,它将在第二次调用之后执行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."
,但这是您的应用程序。
新年快乐。干杯!
最好的方法和最有效的方法是try, catch and finally
catch 在这里是可选的
`try{
// do something
return;
} finally {
// call function after return
}`
一般来说,如果您希望在函数返回后执行某些操作,您可以设置一个计时器:
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();
}
问题在于现代浏览器会杀死很多在卸载/卸载前运行的进程,以“加速”浏览器,使其更快。所以如果它是异步的,你将有一个竞争条件。
return 表示你正在从被调用函数的执行中返回。当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");
});
您可以使用setTimeout
来实现这一点。您的代码应如下所示
window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
setTimeout(function(){
Logout();
}, 0);
return "You are logged out.";
}
};
这将确保Logout
在 return 语句之后执行。
var a = 10;
function b(){
a = 25;
return;
function a(){}
}
b();
document.write(a);
尝试一下
我找到了两种方法来解决这个问题。第一个是如上所述的 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();
我猜 Logout 是一个耗时的过程,您想在执行之前向用户提供反馈:
setTimeout(Logout,1);
return "You are logged out.";