2011-08-22 26 views
3

如何使用的setTimeout如果我想返回一个值JavaScript的 - 的setTimeout返回

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


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

你将如何使用这个返回值?这似乎没有多大意义。 – user1122345

+0

你想要返回什么值?你不知道什么时候会发生超时运行。 – HBP

+0

我想每2秒调用函数func并在每次调用时返回一个值。 – bob

回答

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); 
} 
0

将其更改为:

var defValue; 

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

这种方式,您可以用利用DefValue在你的函数访问返回值

3

首先,确保你传递给setTimeout一个函数,在你的例子中你向传递了它,就像你func(param1)执行直接。你需要的是这样的:

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)。

+3

这个想法很好也很正确,但是'setTimeout(func(parm1,callback),2000);'是错误的,因为它会立即被评估。你想做'setTimeout(function(){func(parm1,callback);},2000);' –

+0

你是对的。不应该盲目复制代码。 –

+0

当你调用func(parm1,callback)时,是回调一个变量还是函数的名字? – bob

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);