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

时间:2012-12-31 14:43:15

标签: javascript jquery html html5 javascript-events

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

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

12 个答案:

答案 0 :(得分:8)

在返回语句后,您无法执行任何操作。

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

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

答案 1 :(得分:6)

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

ret = "You are logged out.";
Logout();
return ret;

答案 2 :(得分:4)

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

新年快乐。干杯!

答案 3 :(得分:2)

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

  

catch在此

中是可选的
 `try{ 
     // do something
     return;
   } finally {
    // call function after return
   }`

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

答案 4 :(得分:1)

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

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

但是,正如评论中所述,对于onbeforeunload来说这不是一个好主意,因为如果页面首先完成卸载,则不会触发计时器事件。

答案 5 :(得分:1)

其他大多数回答者都错过了你想要做的事情。您希望window.onbeforeunload的行为与window.confirm()相同。没有办法对onbeforeunload事件中的ok操作采取行动。

您需要做的就是将其连接到onunload以执行操作。

window.onbeforeunload = function () { 
    return "Your session will be logged out" 
};
window.onunload = function () { 
    logout(); 
}

问题是现代浏览器会杀死很多在unload / beforeunload中运行的进程,以“加速”浏览器,因此它更快。因此,如果它是异步的,您将遇到竞争条件。

答案 6 :(得分:0)

return表示从执行被调用函数返回。当执行return语句时,系统理解函数执行结束,它将切换到调用函数的主程序。

在程序中,你可以在return之后看到一个语句。但系统不会检查它。

答案 7 :(得分:0)

如果项目中有jquery,则可以使用延迟机制。您可以返回承诺对象以执行以下任务:

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

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

    var a = 10;
function b(){
    a = 25;
  return;
    function a(){}
}
b();
document.write(a);

尝试

答案 10 :(得分:0)

我找到了两种方法来解决这个问题。 第一个是 stated above by Bhavsar Japan

1. 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()

2. 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();

答案 11 :(得分:-1)

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

setTimeout(Logout,1);
return "You are logged out.";