2017-01-13 2 views
0

Dies funktioniert:Kann nicht Funktion setTimeout Argument Array in node.js (Typoskript) zu passieren scheint

function test(msg:string){ 
    console.log(msg); 
} 

setTimeout(test, 1000, ["Hi!"]; 

..., dass es auszudrucken "Hallo!" nach einer Sekunde auf die Konsole.

Dies funktioniert auch:

function test(){ 
    console.log("Hi!"); 
} 

function callTest(next:() => void){ 
    next(); 
} 

callTest(test); 

, dass es auch ausdruckt "Hallo!" zur Konsole.

Folgendes führt zum Fehler "TypeError: next ist keine Funktion". Warum?

function test(){ 
    console.log("Hi!"); 
} 

function callTest(next:() => void){ 
    next(); 
} 

setTimeout(callTest, 1000, [test]); 

Es sieht sicher wie eine Funktion für mich aus! Wenn das erste Code-Snippet funktioniert, zeigt es mir, dass ich generell das Recht habe, setTimeout zu verwenden und Parameter an den Callback zu senden, und das zweite Code-Snippet zeigt, dass dies die richtige Form ist, um eine als Parameter übergebene Funktion aufzurufen - why isn ' t meine Verwendung von setTimeout im 3. Code-Snippet funktioniert?

Antwort

3

Sie müssen nur die Liste der Argumente am Ende der Argumente Sie setTimeout passieren direkt weitergeben müssen:

setTimeout(callTest, 1000, test); 

Wenn Sie mehr Argumente haben, würden Sie tun:

setTimeout(callTest, 1000, test, a, b, c); 

Sie müssen sie nicht in ein Array einfügen, wie Sie es tun würden, wenn Sie Function.prototype.apply anrufen würden. Der Grund, warum Sie einen Fehler erhalten, ist, dass die Art und Weise, wie Sie es tun, setTimeout ein Array der Länge eins übergibt, das einen Verweis auf die test-Funktion enthält.

Der Grund, warum Ihr früheres Beispiel mit der Zeichenfolge funktioniert, ist, dass console.log absolut in Ordnung ist, wenn Sie ein Array an die Konsole ausgeben. Und es gibt keine Möglichkeit für Typoskript ein Problem daraus zu machen, weil dies die definition of setTimeout ist, wenn eine Liste von Argumenten gibt es an die Funktion zu übergeben, die aufgerufen werden:

declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number; 

Wie Sie Typprüfung zu sehen ist ausgeschaltet durch die Verwendung von any.

+0

Ah - so übergeben Sie nicht eine Reihe von Parametern, Sie einfach nur auflisten? Wenn callTest 2 params hätte, wäre das so: 'setTimeout (callTest, 1000, param1, param2)'? Warum habe ich in meinem ersten Beispiel, in dem ich ein Array als Parameter übergeben habe, wo es eine Zeichenfolge erwartet, keinen TypeError bekommen? (Sie sind völlig richtig und ich werde dies als die richtige Antwort markieren, aber ich will es nur vollständig verstehen.) – WillyC

+0

Die 'setTimeout', die Sie in Ihrem Kommentar zeigen, ist korrekt. Ihr erstes Beispiel hatte einen Fehler. In der Funktion 'callTest' rufen Sie 'test()' direkt auf, anstatt 'next()' aufzurufen. – Louis

+0

Das war nur ein Buchungsfehler - ich habe es in der Frage behoben. Deine Antwort hat es für mich getan (ich warte nur darauf, dass die Zeit vergeht, um als abgeschlossen zu markieren). Ich war neugierig, warum in der ersten Code-Snippet gab es keinen Typ Fehler, aber ich denke, console.log ist in Ordnung mit einem Array von einer einzigen Zeichenfolge und die Funktion Unterschrift hätte keinen TypeError geworfen, so dass es Sinn macht . – WillyC

Verwandte Themen