2011-03-06 19 views
5

मैं सिर्फ नाम से कार्यों बुला के बारे में पूछा है, अब मैं return के बाद बयान SetTimeout कार्रवाई करने के लिए करना चाहते हैं:वापसी मान जाओ के बाद 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() पर फ़ंक्शन संदर्भ पास करें। समारोह के दिए गए मान की दुकान के लिए, बस समारोह आप 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 से कोई मान वापस करना चाहते हैं, तो यह काम नहीं करेगा।

setTimeout जिसका अर्थ है कि ECall से पहले setTimeout कोड शुरू हो जाती है वापस आ जाएगी अतुल्यकालिक है।

या यदि आप 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

को पारित आप ने लिखा है कि यह, setTimeout के बाद वापसी मान प्राप्त करने के लिए असंभव है सही में एक चर के लिए असाइन करें? क्या ऐसा करने के कोई तरीके हैं? – Ockonal

+0

@ ओकोनल: मैंने अपने जवाब में एक चेतावनी का उपयोग किया, लेकिन @ टिम डाउन उसी अवधारणा को दिखाता है [उसके जवाब में] (http://stackoverflow.com/questions/5211103/get-return-value-after-settimeout/5211190# 52111 9 0), लेकिन परिणाम को प्री-डिफ़ाइंड वैरिएबल में स्टोर करता है (जो आप चाहते हैं)। मान निश्चित रूप से 'सेटटाइमआउट' रन तक उपलब्ध नहीं होगा। – user113716