javascript - setTimeout return

前端 未结 4 1253
臣服心动
臣服心动 2020-12-18 12:52

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

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


function func(in)         


        
相关标签:
4条回答
  • 2020-12-18 13:00

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

    0 讨论(0)
  • 2020-12-18 13:03

    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);
    }
    
    0 讨论(0)
  • 2020-12-18 13:11

    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 讨论(0)
  • 2020-12-18 13:15

    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

    0 讨论(0)
提交回复
热议问题