2011-08-22 25 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);