javascript - setTimeout返回

时间:2011-08-22 00:05:43

标签: javascript jquery settimeout

如果我想返回值

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


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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

首先,在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)。

答案 2 :(得分:0)

将其更改为:

var defValue;

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

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

答案 3 :(得分:0)

这很丑陋,但你可以使用输出参数,因为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);