在javascript中返回语句后执行语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在javascript中返回语句后执行语句相关的知识,希望对你有一定的参考价值。

window.onbeforeunload = function() {
    if (document.getElementById("parentpan").style.display == "block") {
        return "You are logged out.";
            Logout();
    }
};

我希望在return语句之后调用logout()函数,是否可能?

答案

return语句结束一个函数,你不能在它之后执行代码。你可以这样做:

ret = "You are logged out.";
Logout();
return ret;
另一答案

我猜测Logout是一个耗时的过程,您希望在执行之前向用户提供反馈:

setTimeout(Logout,1);
return "You are logged out.";
另一答案

在return语句之后,您无法执行任何操作。

编辑:finally语句允许在return之后执行代码以进行清理。

(这是XY问题的一个很好的例子:你问Y而从不告诉我们你实际需要什么X)。

另一答案

你需要的是异步执行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."的消息之前注销,但这是你的应用程序。

新年快乐。干杯!

另一答案

最好的方法和最有效的方法是**尝试,捕获,最后**

catch是可选的

 `try{ 
     // do something
     return;
   } finally {
    // call function after return
   }`

https://youtu.be/Is_o_L-ZIS8这对你有帮助

另一答案

通常,如果您希望在函数返回后执行某些操作,则可以设置计时器:

function myFunction() {
    if (document.getElementById("parentpan").style.display == "block") {
        setTimeout(Logout, 50); // Logout will be called 50ms later
        return "You are logged out.";
    }
};

但是,如注释中所述,这对onbeforeunload来说不是一个好主意,因为如果页面首先完成卸载,则不会触发timer事件。

另一答案

大多数其他回答者都错过了你想要做的事情。你希望window.onbeforeunloadwindow.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");        
});

Demo

另一答案

您可以使用setTimeout来实现此目的。您的代码应如下所示

window.onbeforeunload = function() {
    if (document.getElementById("parentpan").style.display == "block") {
        setTimeout(function(){
            Logout();
        }, 0);
        return "You are logged out.";
    }
};

这将确保在return语句后执行Logout

以上是关于在javascript中返回语句后执行语句的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript-Runoob:JavaScript 条件语句

try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

JavaScript-Runoob:JavaScript switch 语句

javascript 语句

JavaScript 条件语句

Java中,finally在try语句块中的return前执行还是后执行