如果我想返回值
,如何使用setTimeout$.each(pCodes, function(index, pCode) {
setTimeout(func(parm1), 2000);
});
function func(in)
{
var value = 999;
return value;
}
答案 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);