2014-07-24 17 views
17

Ich möchte nur den Rückgabewert von setTimeout, aber was bekomme ich ein ganzes Textformat der Funktion?Erhalte Rückgabewert von setTimeout

function x() { 
    setTimeout(y = function() { 
     return 'done'; 
    }, 1000); 
    return y; 
} 

console.log(x()); 
+0

Ihre Syntax wie das heißt, es Funktion nur zurück. – Mritunjay

+0

willst du "done" zurückgeben? Wie können Sie ein Ergebnis der Funktion zurückgeben, die 1000 ms später aufgerufen wird? –

+0

Timeouts sind asynchron, daher können Sie nicht von ihnen zurückkehren. (Nun, Sie können, aber der Rückgabewert geht nirgendwohin) – Ferdi265

Antwort

29

Sie müssen Versprechen dafür verwenden. Sie sind available in ES6 aber quite easily polyfilled werden:

function x() { 
    var promise = new Promise(function(resolve, reject) { 
    window.setTimeout(function() { 
     resolve('done!'); 
    }); 
    }); 
    return promise; 
} 

x().then(function(done) { 
    console.log(done); // --> 'done!' 
}); 
+0

eigentlich das 'done' in meinem Beispiel war ein Versprechen, das innerhalb eines setTimeout zurückgegeben werden muss .. weil ich die zurückgestellte deferred.resolve() innerhalb von setTimeout nicht bekommen kann. wie wäre es? danke – Vainglory07

+1

Können Sie ein klareres Beispiel Ihres Codes in der Frage bekannt geben? –

4

Sie können keinen Rückgabewert von der Funktion erhalten, die Sie an setTimeout übergeben.

Die Funktion, die setTimeout (x in Ihrem Beispiel) genannt Ausführung wird beendet und zurück, bevor die Funktion, die Sie setTimeout passieren wird auch genannt.

Was immer Sie mit dem Wert, den Sie erhalten, tun möchten, müssen Sie es von der Funktion tun, die Sie an setTimeout übergeben.

In Ihrem Beispiel wäre, dass geschrieben als:

function x() { 
    setTimeout(function() { 
     console.log("done"); 
    }, 1000); 
} 

x(); 
+0

Schöne und präzise Erklärung! –

1

besser für die Funktion x einen Rückruf zu nehmen und jeder Aufgabe, die Sie wollen nach dem Timeout auszuführen in diesem Rückruf senden.

function x (callback) { 
    setTimeout(function() { 
     callback("done"); 
    }, 1000); 
} 

x(console.log.bind(console)); //this is special case of console.log 
x(alert) 
0

Ich glaube, Sie haben Flag wollen Ereignis wissen aufgetreten oder nicht. setTimeout gibt keinen Wert zurück. Sie können eine Variable zu erkennen, verwenden Ereignis aufgetreten oder nicht

var y="notdone"; 
    setTimeout(function() { 
     y="done"; 
    }, 1000); 

können Sie Variable y Zugriff nach Zeit getan zu wissen, aufgetreten ist oder nicht