2011-03-06 7 views
5

後の戻り値を取得し、私はちょうど今、私はSetTimeoutreturn文を処理したい、名前で関数を呼び出すことについて尋ねてきました:のSetTimeout

function ECall(funcName, arg) 
{ 
    command += "("; 
    for (var i=1; i<arguments.length; i++) 
    { 
     command += "'" + arguments[i] + "'"; 
     if (i != arguments.length-1) command += ','; 
    } 
    command += ")"; 

    //var funcPtr = eval(funcName); 
    //return funcPtr(arg); // This works, but I need SetTimeout 

    setTimeout('window[\'' + funcName + '\']' + command, 1000); 
} 

setTimeoutは素晴らしい作品が、私は呼び出された関数の戻り値を保存する必要があります。書き込み時:setTimeout('alert(window[\'' + funcName + '\']' + command + ')', 1000); 関数の戻り値を警告します。どうすれば保存できますか?

答えて

5

。関数リファレンスをwindow.setTimeout()に渡すだけです。関数の戻り値を格納するには、単にあなたがそれを右に、setTimeoutを後に戻り値を取得することは不可能だと書いたあなたはwindow.setTimeout()

var savedValue; 

function ECall(funcName) 
{ 
    var args = Array.prototype.slice.call(arguments, 1); 
    var func = window[funcName]; 

    window.setTimeout(function() { 
     savedValue = func.apply(this, args); 
    }, 1000); 
} 
2

ECallから値を返す場合は、機能しません。

setTimeoutsetTimeoutコードが呼び出されるECallが返されることを意味し、非同期です。

alert()setTimeoutの一部にしたい場合は、無名関数を渡すことができます。また、文字列をsetTimeoutに渡さない方が良いでしょう。

私の代わりにこれを行うだろう:あなたは、この文字列操作のいずれかを使用する必要はありません

function ECall(funcName, arg) 
{ 
     // Get an Array of the arguments, except for the first one. 
    var args = Array.prototype.slice.call(arguments, 1); 

     // Pass an anonymous function that calls the global "funcName" function 
     // inside the alert(). 
     // It uses .apply() to pass the arguments we sliced. 
    setTimeout(function() { 
     alert(window[ funcName ].apply(window, args)); 
    }, 1000); 
} 
+1

に渡す関数内の変数に代入?それを行う方法はありますか? – Ockonal

+0

@Ockonal:私は私の答えで警告を使いましたが、@ Tim Downは同じ考え方を彼の答えで示しています(http://stackoverflow.com/questions/5211103/get-return-value-after-settimeout/5211190# 5211190)、結果をあらかじめ定義された変数に格納します(これはあなたが望んでいたようです)。値は 'setTimeout'が実行されるまで利用できません。 – user113716