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

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

4

12 回答 12

12

在 return 语句之后你不能执行任何东西。

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

(这是 XY 问题的一个很好的例子:你问的是 Y,却从来没有告诉我们你真正需要什么 X)。

于 2012-12-31T14:44:05.337 回答
7

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

ret = "You are logged out.";
Logout();
return ret;
于 2012-12-31T14:44:57.823 回答
6

您需要的是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.",但这是您的应用程序。

新年快乐。干杯!

于 2012-12-31T15:04:22.423 回答
6

最好的方法和最有效的方法是try, catch and finally

catch 在这里是可选的

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

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

于 2017-12-23T01:27:59.343 回答
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 不是一个好主意,因为如果页面首先完成卸载,则不会触发计时器事件。

于 2012-12-31T14:50:20.783 回答
1

大多数其他回答者都错过了您在这里尝试做的事情。你想window.onbeforeunload表现得像window.confirm()。没有办法对 onbeforeunload 事件中的 ok 操作采取行动。

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

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

问题在于现代浏览器会杀死很多在卸载/卸载前运行的进程,以“加速”浏览器,使其更快。所以如果它是异步的,你将有一个竞争条件。

于 2012-12-31T15:10:11.600 回答
0

return 表示你正在从被调用函数的执行中返回。当return语句被执行时,系统知道函数执行已经结束,它会切换到调用函数的主程序。

在程序中,你可以看到return后的语句。但系统甚至不会检查。

于 2012-12-31T14:51:08.847 回答
0

如果您的项目中有 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");        
});

演示

于 2012-12-31T15:14:19.740 回答
0

您可以使用setTimeout来实现这一点。您的代码应如下所示

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

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

于 2017-07-10T12:46:58.833 回答
0
    var a = 10;
function b(){
    a = 25;
  return;
    function a(){}
}
b();
document.write(a);

尝试一下

于 2019-09-24T07:54:41.703 回答
0

我找到了两种方法来解决这个问题。第一个是如上所述的 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();

于 2021-05-05T11:39:59.013 回答
-1

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

setTimeout(Logout,1);
return "You are logged out.";
于 2012-12-31T14:50:52.793 回答