Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中return语句后的Execute语句_Javascript_Jquery_Html_Dom Events - Fatal编程技术网

Javascript中return语句后的Execute语句

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

我希望在return语句之后调用
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);