2011-03-06 48 views
5

Tôi vừa hỏi về gọi chức năng theo tên, bây giờ tôi muốn xử lý return tuyên bố sau SetTimeout:Nhận giá trị trả về sau khi 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 hoạt động tuyệt vời, nhưng tôi phải lưu giá trị trả lại chức năng gọi . Khi tôi viết: setTimeout('alert(window[\'' + funcName + '\']' + command + ')', 1000); Nó cảnh báo giá trị trả về của hàm. Làm thế nào tôi có thể lưu trữ nó?

Trả lời

5

Bạn không cần phải sử dụng bất kỳ thao tác chuỗi này. Chỉ cần chuyển một tham chiếu hàm tới window.setTimeout(). Để lưu trữ các giá trị trả về của hàm, chỉ cần gán nó vào một biến trong chức năng bạn vượt qua để 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

Nếu bạn muốn trả lại giá trị từ ECall, nó sẽ không hoạt động.

Các setTimeout là không đồng bộ, có nghĩa là các ECall sẽ trở lại trướcsetTimeout được gọi.

Hoặc nếu bạn muốn alert() là một phần của setTimeout, bạn có thể chuyển một hàm ẩn danh. Ngoài ra, sẽ tốt hơn nếu không chuyển một chuỗi đến setTimeout.

Tôi muốn làm điều này thay vì:

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

Bạn viết rằng nó không thể để có được giá trị trả về sau khi setTimeout, phải không? Có cách nào để làm điều đó không? – Ockonal

+0

@Ockonal: Tôi đã sử dụng cảnh báo trong câu trả lời của mình, nhưng @Tim Down hiển thị cùng một khái niệm [trong câu trả lời của anh ấy] (http://stackoverflow.com/questions/5211103/get-return-value-after-settimeout/5211190# 5211190), nhưng lưu trữ kết quả trong một biến được xác định trước (đó là những gì bạn dường như muốn). Giá trị sẽ không có sẵn cho đến khi 'setTimeout' chạy tất nhiên. – user113716

Các vấn đề liên quan