开发者

javascript - setTimeout return

How can I use setTimeout if I want to return a value

$.each(pCodes, function(index, pCode) {
    setTimeout(func(parm1), 2000);     开发者_StackOverflow中文版 
});


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


First of all, your call to setTimeout is wrong. You are calling the function func and then using the result in the setTimeout method. Your code is equivalent to:

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

As func returns 999, you will be doing setTimeout(999, 2000), which of course doesn't make sense. To call a function that takes a parameter from setTimeout you need a function that makes that function call:

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

To handle the return value from func is a bit more complicated. As it's called later on, you have to handle the return value later on. Usually that is done with a callback method that is called when the return value is available:

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


First of all, make sure you pass to setTimeout a function, in your example you passed undefined to it, as you func(param1) executes func directly. What you want is something like this:

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

And for 'returning' the value: Use some kind of callback function that is executed with the value when timeout expired. Like so:

function callback(value) {
  //  doSomethingWithNewValue
}

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


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

This is the general pattern used in such scenario (see event driven programming).


change it to :

var defValue;

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

this way you can use the defValue in your function to access the returned value


It's pretty ugly, but you can use output parameters, since js objects are pass by reference:

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

function b(val, output) {
    something();
    output.returned = 4;
}

Or, you can use a callback (the better option):

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

function b(val, callback) {
    //something
    callback(4);
}

By the way, your call to setTimeout is wrong. setTimeout receives a function as a first parameter, and a delay as a second - the first argument is still seen as regular javascript code, so it evaluates it, so your setTimeout call turns out to be like this:

setTimeout(999, 2000);

Since you're returning 999 from the function.

However, setTimeout can also receive a list of arguments after the second parameter, so it can be turned into this:

setTimeout(func, 2000, param1);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜