window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
return "You are logged out.";
Logout();
}
};
我希望在return
语句后调用logout()
函数,这可能吗?
window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
return "You are logged out.";
Logout();
}
};
我希望在return
语句后调用logout()
函数,这可能吗?
在return语句之后不能执行任何内容。
编辑:finally语句允许在return之后执行代码以进行清理。
(这是一个关于XY问题的很好的例子:你问了Y,但从未告诉我们你实际需要的X是什么。)
finally
) - SLaks最好的方法和最有效率的方法是try、catch和finally
在这里,catch是可选的
`try{
// do something
return;
} finally {
// call function after return
}`
https://youtu.be/Is_o_L-ZIS8 这对你有帮助。
return语句结束一个函数,它之后的代码将不会被执行。你可以这样做:
ret = "You are logged out.";
Logout();
return ret;
Logout
。这可以通过使用JavaScript中的setTimeout
函数轻松实现,正如其他人所说的那样。以下是我常用的异步调用函数的方法: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
是异步调用的,因此它将在第二次调用 alert
之后执行。只需在函数调用前加上 async
即可实现。以下是您需要执行的操作:
window.onbeforeunload = function () {
if (document.getElementById("parentpan").style.display === "block") {
Logout.async();
return "You are logged out.";
}
};
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 操作。window.onbeforeunload = function () {
return "Your session will be logged out"
};
window.onunload = function () {
logout();
}
问题在于现代浏览器会终止运行在卸载/离开页面之前的许多进程,以“加速”浏览器,因此如果是异步的,就会出现竞争条件。
setTimeout
来实现这个功能。你的代码应该如下所示。window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
setTimeout(function(){
Logout();
}, 0);
return "You are logged out.";
}
};
这将确保在返回语句之后执行Logout
。
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");
});
返回意味着您正在从调用的函数执行中返回。当执行 return 语句时,系统会理解函数执行已经结束,并且它将从调用该函数的主程序切换。
在程序中,您可以在 return 之后看到一个语句。但是系统不会检查那个语句。
我找到了两种方法来解决这个问题。 第一种方法是如 Bhavsar Japan所述
try, catch和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();
window.confirm()
那样起作用。 - epascarello