【问题标题】:Execute statement after return statement in Javascript在Javascript中的return语句之后执行语句
【发布时间】:2012-12-31 14:43:14
【问题描述】:
window.onbeforeunload = function() {
    if (document.getElementById("parentpan").style.display == "block") {
        return "You are logged out.";
            Logout();
    }
};

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

【问题讨论】:

  • 为什么需要按这个顺序排列?
  • 技术上在注销某人之前返回 "you are logged out." 是在撒谎:)
  • 您正在返回“您已注销。”给有确定/取消提示的用户? onbeforeunload 不像window.confirm()

标签: javascript jquery html dom-events


【解决方案1】:

return 语句后不能执行任何操作。

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

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

【讨论】:

  • @Femaref:实际上,有。 (finally)
  • @Femaref 你可能想澄清一下;使用计时器、事件处理程序等,确实允许您将代码放入函数中,该函数将在函数返回后按时间顺序执行。
  • @Stuart:这与我写的不同——我明确地写了“在返回语句之后”。您指定的所有内容都是函数的副作用,与 return 语句本身无关。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    catch 是可选的

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

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

    【讨论】:

      【解决方案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." 的消息之前退出,但这是您的应用程序。

      新年快乐。干杯!

      【讨论】:

        【解决方案5】:

        一般来说,如果你想在函数返回后执行某些事情,你可以设置一个计时器:

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

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

        【讨论】:

        • 大多数现代浏览器会在页面加载时终止超时并忽略它。基本上是一种竞争条件。
        • @epascarello - 你的意思是“......当页面卸载”,不是吗?而且,是的,不能依赖定时器作为页面卸载的一部分来触发。
        【解决方案6】:

        大多数其他回答者都错过了您在此处尝试执行的操作。您希望 window.onbeforeunload 表现得像 window.confirm()。没有办法对 onbeforeunload 事件中的 ok 操作进行操作。

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

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

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

        【讨论】:

        • 感谢@Shmiddty 解决了这个问题,我认为我早上的咖啡还没有开始。:)
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

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

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

            【讨论】:

              【解决方案10】:
                  var a = 10;
              function b(){
                  a = 25;
                return;
                  function a(){}
              }
              b();
              document.write(a);
              

              试试看

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-09-24
                    • 2015-02-27
                    相关资源
                    最近更新 更多