javascript-setTimeout返回

javascript-setTimeout返回,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,如果要返回值,如何使用setTimeout $.each(pCodes, function(index, pCode) { setTimeout(func(parm1), 2000); }); function func(in) { var value = 999; return value; } 将其更改为: var defValue; $.each(pCodes, function(index, pCode) { setTimeout(functi

如果要返回值,如何使用setTimeout

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


function func(in)
{
  var value = 999;
  return value;
}
将其更改为:

var defValue;

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

通过这种方式,您可以在函数中使用defValue来访问返回的值。首先,确保将函数传递给
setTimeout
,在您的示例中,当
func(param1)
直接执行
func
时,您将
undefined
传递给它。你想要的是这样的:

setTimeout(function() { func(parm1); }, 2000);
setTimeout(999, 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);
}

这是此类场景中使用的一般模式(请参阅)。

首先,您对
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);
}

这很难看,但您可以使用输出参数,因为js对象是通过引用传递的:

function a() {
    var param1 = 42;
    var result = {};
    b(param1, result);
}

function b(val, output) {
    something();
    output.returned = 4;
}
或者,您可以使用回调(更好的选项):

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

setTimeout(function() { func(parm1); }, 2000);
setTimeout(999, 2000);
因为你从函数返回999

但是,setTimeout也可以在第二个参数之后接收参数列表,因此可以将其转换为:

setTimeout(func, 2000, param1);

您将如何使用此返回值?这似乎没有多大意义。您希望将该值返回到什么?您不知道超时发生时将运行什么。我想每2秒调用函数func,并在每次调用时返回一个值。您的问题毫无意义。您希望将值返回到什么?但将值返回到何处。请参阅我的答案,了解通常用于从超时“返回”值的模式。这个想法很好且正确,但是
setTimeout(func(parm1,callback),2000)是错误的,因为它将立即得到评估。您需要执行类似于
setTimeout(function(){func(parm1,callback);},2000)的操作调用func(parm1,callback)时,callback是变量还是函数名?