Javascript中return语句后的Execute语句
我希望在return语句之后调用Javascript中return语句后的Execute语句,javascript,jquery,html,dom-events,Javascript,Jquery,Html,Dom Events,我希望在return语句之后调用logout()函数,是否可能?在return语句之后不能执行任何操作 编辑:出于清理目的,finally语句允许在返回后执行代码 (这是XY问题的一个很好的例子:你问的是Y,而从来没有告诉我们你实际需要什么X)。返回语句结束了一个函数,你不能在它之后执行代码。您可以这样做: window.onbeforeunload = function() { if (document.getElementById("parentpan").style.display
logout()
函数,是否可能?在return语句之后不能执行任何操作
编辑:出于清理目的,finally
语句允许在返回后执行代码
(这是XY问题的一个很好的例子:你问的是Y,而从来没有告诉我们你实际需要什么X)。返回语句结束了一个函数,你不能在它之后执行代码。您可以这样做:
window.onbeforeunload = function() {
if (document.getElementById("parentpan").style.display == "block") {
return "You are logged out.";
Logout();
}
};
通常,如果希望在函数返回后执行某些操作,可以设置计时器:
ret = "You are logged out.";
Logout();
return ret;
但是,如评论中所述,这对于onbeforeunload不是一个好主意,因为如果页面首先完成卸载,则不会触发计时器事件。我猜注销是一个时间密集的过程,您希望在执行之前向用户提供反馈:
function myFunction() {
if (document.getElementById("parentpan").style.display == "block") {
setTimeout(Logout, 50); // Logout will be called 50ms later
return "You are logged out.";
}
};
return表示从被调用函数的执行中返回。当执行return语句时,系统理解函数执行已结束,并将切换到调用函数的主程序
在程序中,您可以在返回后看到一条语句。但是系统甚至不会检查它。您需要的是异步执行注销。正如其他人所说,通过使用setTimeout
函数,可以在JavaScript中轻松实现这一点。以下是我通常用于异步调用函数的方法:
setTimeout(Logout,1);
return "You are logged out.";
此方法立即将函数调用推送到事件循环上(在0
ms之后)。因此,函数将在当前代码完成后执行(对于您来说,是在返回之后)。下面是如何使用它的一个简单示例:
Function.prototype.async = function () {
setTimeout.bind(null, this, 0).apply(null, arguments);
};
由于第一个警报
是异步调用的,因此它将在第二次调用警报
后执行。就像在函数调用之前使用async
一样简单。这是您在您的情况下要做的:
alert.async("This will be displayed later.");
alert("This will be displayed first.");
缺点是什么?由于函数在事件循环中被阻止,它可能永远没有机会执行(因此用户永远不会注销)。这种情况可能会出现。它通常发生在控件进入无限循环时,或者由于阻塞AJAX请求而挂起时
不过,这对你来说是个好消息,这种情况很少发生。所以别担心。只要像其他人取笑你一样使用setTimeout
,你就会做得很好。就我个人而言,我认为您应该在返回“您已注销”的消息之前注销。
,但这是您的应用程序
新年快乐。干杯 大多数其他回答者都不知道你在这里想做什么。您希望window.onbeforeunload
像window.confirm()
。无法对onbeforeunload事件中的ok操作进行操作
你要做的就是把它挂在onunload上,然后再做这个动作
window.onbeforeunload = function () {
if (document.getElementById("parentpan").style.display === "block") {
Logout.async();
return "You are logged out.";
}
};
问题是,现代浏览器会杀死很多在unload/beforeunload中运行的进程,以“加速”浏览器,使其更快。因此,如果它是异步的,您将有一个竞争条件 如果您的项目中有jquery,则可以使用延迟机制。您可以为正在进行的任务返回promise对象,如:
window.onbeforeunload = function () {
return "Your session will be logged out"
};
window.onunload = function () {
logout();
}
您可以使用setTimeout
来实现这一点。您的代码应该如下所示
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语句之后执行注销。最好的方法和最有效的方法是尝试、捕获并最终执行
在这种情况下,catch是可选的
这对你很有帮助
`try{
// do something
return;
} finally {
// call function after return
}`
试试看我找到了两种方法。
第一个是
1.带有try、catch和finally的示例
const example1=()=>{
试一试{
返回console.log('将首先执行')
}最后{
console.log('将执行第二个')
}
返回“永远不会执行”
}
常量main=()=>{
const message=example1();
console.log(消息)
}
main()?onbeforeunload的行为不像窗口。confirm()
@Femaref:实际上,有。(最后
)@Femaref您可能想澄清一下;使用计时器、事件处理程序等,确实允许您将代码放入函数中,该函数将在函数返回后按时间顺序执行。@Stuart:这与我写的有所不同-我是在“返回语句后”显式编写的。您指定的所有内容都是函数的副作用,与返回语句本身没有任何关系。大多数现代浏览器会在页面加载时终止超时并忽略它。基本上是一种竞争条件。@epascarello-你的意思是“…当页面卸载时”,不是吗?而且,是的,计时器不能作为页面卸载的一部分来启动。谢谢@shmiddy修复了这个问题,我不认为我的早咖啡还没有启动。:)
`try{
// do something
return;
} finally {
// call function after return
}`
var a = 10;
function b(){
a = 25;
return;
function a(){}
}
b();
document.write(a);