【问题标题】:javascript - setTimeout returnjavascript - setTimeout 返回
【发布时间】:2011-08-22 08:24:21
【问题描述】:

如果我想返回一个值,如何使用 setTimeout

$.each(pCodes, function(index, pCode) {
    setTimeout(func(parm1), 2000);      
});


function func(in)
{
  var value = 999;
  return value;
}

【问题讨论】:

  • 你会如何使用这个返回值?这似乎没有多大意义。
  • 你想把那个值返回到什么地方?你不知道超时发生时会运行什么。
  • 我想每 2 秒调用一次函数 func 并在每次调用时返回一个值。
  • 你的问题毫无意义。你想返回什么值
  • 但是返回一个值到哪里。请参阅我对通常用于从超时中“返回”值的模式的回答。

标签: javascript jquery settimeout


【解决方案1】:

首先,您对setTimeout 的调用是错误的。您正在调用函数func,然后在setTimeout 方法中使用结果。您的代码相当于:

$.each(pCodes, function(index, pCode) {
  var temp = func(parm1);
  setTimeout(temp, 2000);      
});

由于func 返回999,您将执行setTimeout(999, 2000),这当然没有意义。要调用从 setTimeout 获取参数的函数,您需要一个函数来调用该函数:

$.each(pCodes, function(index, pCode) {
  setTimeout(function() { func(parm1); }, 2000);
});

处理来自func 的返回值有点复杂。稍后调用它,您必须稍后处理返回值。通常这是通过在返回值可用时调用的回调方法来完成的:

var callback = function(value) {
  // Here you can use the value.
};
$.each(pCodes, function(index, pCode) {
  setTimeout(function() { func(parm1, callback); }, 2000);
});

function func(in, callback) {
  var value = 999;
  callback(value);
}

【讨论】:

    【解决方案2】:

    首先,确保您传递给setTimeout 一个函数,在您的示例中,您将undefined 传递给它,因为您func(param1) 直接执行func。你想要的是这样的:

    setTimeout(function() { func(parm1); }, 2000);
    

    对于“返回”值:使用某种回调函数,在超时到期时使用该值执行。像这样:

    function callback(value) {
      //  doSomethingWithNewValue
    }
    
    $.each(pCodes, function(index, pCode) {
        setTimeout(function() { func(parm1, callback); }, 2000);      
    });
    
    
    function func(in, callback)
    {
      var value = 999;
      callback(value);
    }
    

    这是在这种情况下使用的一般模式(请参阅event driven programming)。

    【讨论】:

    • 这个想法很好而且正确,但setTimeout(func(parm1, callback), 2000); 是错误的,因为它会立即得到评估。你想做类似setTimeout(function(){func(parm1, callback);}, 2000);
    • 调用func(parm1, callback)时,callback是变量还是函数名?
    【解决方案3】:

    改成:

    var defValue;
    
    $.each(pCodes, function(index, pCode) {
        setTimeout(function(){defValue=func(parm1)}, 2000);      
    });
    

    这样你就可以在你的函数中使用 defValue 来访问返回的值

    【讨论】:

      【解决方案4】:

      虽然很丑,但是你可以使用输出参数,因为js对象是通过引用传递的:

      function a() {
          var param1 = 42;
          var result = {};
          b(param1, result);
      }
      
      function b(val, output) {
          something();
          output.returned = 4;
      }
      

      或者,您可以使用回调(更好的选择):

      function a() {
          var param1 = 42;
          b(param1, function (newVal) {
              something();
          });
      }
      
      function b(val, callback) {
          //something
          callback(4);
      }
      

      顺便说一句,您对 setTimeout 的调用是错误的。 setTimeout 接收一个函数作为第一个参数,并接收一个延迟作为第二个参数 - 第一个参数仍然被视为常规 javascript 代码,因此它会对其进行评估,因此您的 setTimeout 调用结果是这样的:

      setTimeout(999, 2000);
      

      因为您从函数返回 999。

      不过setTimeout也可以在第二个参数之后接收参数列表,所以可以变成这样:

      setTimeout(func, 2000, param1);
      

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 2013-11-27
        • 2012-02-09
        • 2018-07-31
        相关资源
        最近更新 更多