Получить возвращаемое значение после SetTimeout - PullRequest
5 голосов
/ 06 марта 2011

Я только что спросил о вызове функций по имени, теперь я хочу обработать оператор return после 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); Это предупреждает возвращаемое значение функции.Как я могу сохранить его?

Ответы [ 2 ]

5 голосов
/ 06 марта 2011

Вам не нужно использовать какие-либо из этих манипуляций со строками.Просто передайте ссылку на функцию на 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 голосов
/ 06 марта 2011

Если вы хотите вернуть значение из 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);
}
...