2016-01-04 11 views
5

Ich brauche den folgenden Code wirdWeiter tick Überschreibung Funktionalität tut Funktion aufgerufen wird

Hier kann die Funktion in dem nächsten Tick ausgeführt

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { 
    setTimeout(fn, 5); 
} : function (fn) { fn(); }; 

mit dieser wird außer Kraft zu setzen,

window.require.nextTick = function(fn) { fn(); }; 

Da die Funktion sofort aufgerufen wird, wird in diesem Fall nicht beim nächsten Tick ausgeführt?

+0

was wollen Sie genau? –

+0

@BhojendraNepal - Ich mag überprüfen, ob die Funktion auf dem nächsten Tick nach dem Wechsel genannt wird ... –

+0

schließlich definierte Funktion wird die vorherigen außer Kraft setzen, so dass die vorherigen nicht ausgeführt gehen werden. –

Antwort

2

wenn ich den Code auf die zweite Option wechaer ändern Es wird problematisch sein und wenn ja warum ???

Ich empfehle nicht, diese Änderung zu machen, weil es im Allgemeinen problematisch sein kann. Die Dokumentation für require.nextTick (die kurz vor der Funktionsdefinition angezeigt wird) lautet:

Führen Sie etwas nach dem aktuellen Tick der Ereignisschleife aus.

Aufruf fn verletzt synchron die Spezifikation, die Ausführung „nach dem aktuellen Tick“ geschehen soll. (Siehe das Ende meiner Antwort auf einen möglichen Einwand hier.)

Wenn Sie sich fragen, warum es ein Problem sein kann, der Ansicht, dass RequireJS hört Ereignisse DOM. Eine Sache, die eine Funktion wie require.nextTick mit tut, ist eine Chance geben, Event-Handler zu laufen. Wenn Sie require.nextTick festlegen, um seine Funktion synchron auszuführen, geben Sie Ereignishandlern keine Möglichkeit zum Ausführen. In einigen Fällen könnte dies dazu führen, dass RequireJS nicht mehr ordnungsgemäß funktioniert.

An diesem Punkt könnte man die Definition von nextTick ist das Objekt, so dass es in Ordnung ist es fn nennen synchron zu haben, denn wenn setTimeout nicht definiert ist, dann ist es fn synchron aufrufen:

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { 
    setTimeout(fn, 4); 
} : function (fn) { fn(); }; 

Ich denke, das ist für ungewöhnliche Fälle gedacht, nicht die übliche Situation, wo Module durch HTTP-Anfragen asynchron geladen werden. In einigen Fällen, wie vielleicht eingebettete Geräte, denen die JS-Umgebung von Browsern oder Node fehlt.js, die einzige Möglichkeit, eine Software mit RequireJS auszuführen, besteht darin, ein optimiertes Paket zu laden, das r.js durchlaufen hat und require.js im Paket enthält. In einem Fall wie diesem, mit nextTick Aufruf fn synchron wäre moot weil, wenn RequireJS ausgeführt wird, wurden alle Module bereits geladen.

1

Wenn Sie eine Funktion wie dieses:

window.require.nextTick = function(fn) { fn(); }; 

jedes Mal Sie window.require.nextTick() aufrufen, wird fn() sofort ausgeführt werden.

wenn ich den Code in die zweite Option zu ändern whethaer Es wird

Kein problematisch sein, es wird keine Probleme verursachen. Der einzige Unterschied zwischen dem ersten und zweiten Code besteht darin, dass in der ersten fn() nach 5 Millisekunden aufgerufen wird und in der zweiten sofort aufgerufen wird. In beiden Beispielen wird fn() jedes Mal aufgerufen, wenn Sie window.require.nextTick() anrufen.

1

Es ist etwas grundlegend falsch mit der ursprünglichen Funktion. Es verhält sich sehr anders, wenn setTimeout nicht definiert ist.

Javascript läuft auf event loop. Ihr JavaScript-Code wird ausgeführt, bis er fertig ist, und anderer JavaScript-Code wartet in der Warteschlange. Beispielsweise wird ein Ereignis-Listener für ein Benutzerereignis (wie das Klicken auf eine Schaltfläche) in die Warteschlange gestellt und wartet auf den Abschluss des aktuellen Codes.

Ihre nextTick Funktion ist vermutlich dazu gedacht, der "Warteschlange" eine Funktion hinzuzufügen, damit sie später von der Ereignisschleife ausgeführt wird. Dies ist manchmal nützlich. Sie können beispielsweise einen eigenen Ereignisemitter verwenden und Ihr eigenes Ereignis in eine Warteschlange stellen.

Ihre nextTick Funktion ist daher gebrochen wenn setTimeout nicht definiert ist. Es wird die Funktion jetzt ausführen, anstatt es der "Warteschlange" hinzuzufügen. Dies führt zu völlig anderen Verhalten, das bedeutet Fehler, die nur für bestimmte Browser auftreten.

Bitte beheben Code dies stattdessen zu verwenden:

window.require.nextTick = function(fn) { setTimeout(fn, 5) }; 

und ignorieren Browser, die nicht setTimeout implementieren kann. Sie können einen großen fetten Fehler anstelle von merkwürdigen kleinen Fehlern haben.

Nur für den Datensatz, funktioniert setTimeout in allen gängigen Browsern für die letzten 20 Jahre oder so. Es wird wieder auf IE4 unterstützt! Also ist diese Bedingung völlig unnötig.