2013-06-03 18 views
14

Dies ist der Quellcode für delay Funktion Underscore.js:Warum hat Underscore.js eine Verzögerungsfunktion?

_.delay = function (func, wait) { 
    var args = slice.call(arguments, 2); 
    return setTimeout(function() { return func.apply(null, args); }, wait); 
}; 

Wie ist das anders aus setTimeout? Warum benötigt Underscore.js delay?

Antwort

21

Es ist eine Cross-Browser-Möglichkeit, zusätzliche Argumente zu übergeben, die als Argumente für den Rückruf angezeigt werden, wie setTimeout(). Dies funktioniert nicht in IE.

Es kann Ihren Code schönere ...

setTimeout(_.bind(function() { }, null, "arg1"), 1e3); 

... vs ...

_.delay(function() { }, 1e3, "arg1"); 

Ich bin damit einverstanden, dass es eine der weniger nützlichen Unders Methoden machen, die in skizziert Naomi's answer.

+1

Internet Explorer unterstützt keine [Rückrufargumente] (https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout#Callback_arguments). Was für ein b ****! –

+0

@ Alex-es unterstützt nicht die Übergabe eines String-Literals als erster Parameter, also nicht * dass * den Browser überqueren. Vielleicht ist das in der Dokumentation erwähnt ... – RobG

+0

@RobG Nun, ich denke nicht, dass das eine Funktion ist, die wir behalten wollen :) – alex

4

Nicht viel, obwohl es thematisch mit defer, debounce, und so weiter passt. Dies bedeutet, dass Sie den Unterstrich Verpackung Notation verwenden:

_(yourfunction).delay(1000); 

Auch scheint es nicht, wie es Ihnen mit einem String-Argument lässt weg, die eval nennen würde.

+2

Ich glaube nicht, dass irgendjemand bei klarem Verstand eine Zeichenfolge an 'setTimeout' übergeben würde. –

+0

@ plynx-nicht unbedingt * eval *, stattdessen könnte der Konstruktor Function verwendet werden. ;-) @ Aadit - nicht schwer, auch Strings zu unterstützen, einfach das erste Argument testen und wenn es eine Zeichenkette ist, benutze den Function-Konstruktor, dann rufe set timeout damit auf. – RobG

+0

@AaditMShah robg Sie beide scheinen mich falsch zu verstehen - ich verweise auf den Vorteil, keine String-Argumente zu akzeptieren. Ich habe es oft und sogar manchmal zufällig gesehen. Sie können viele Beispiele in Code hier auf StackOverflow finden. Programmiererhände sind seltsame Dinge und manchmal setzen sie Zitate um Dinge herum, wenn man nicht hinsieht. – Plynx

11

Warum hat Underscore.js eine Verzögerungsfunktion?

Weil dumm. Diese besondere Methode von underscore.js scheint ziemlich dumm zu sein.

Cons

  1. zusätzliche Funktion in lib bedeutet größere Code-Basis
  2. größere Codebasis bedeutet mehr zu halten und mögliche Fehler
  3. Code, der diese Funktion verwendet hat jetzt eine Abhängigkeit von diesem lib
  4. weniger/keine Verbesserung gegenüber nativer API bedeutet niedrige Kosten: Verstärkungsfaktor
  5. neue Apis zu lernen

Pros

dieser Abschnitt absichtlich leer gelassen


Ich möchte nur lernen Javascript zu verwenden und so etwas wie

var hello = function() { 
    console.log("hello"); 
}; 

var delay = 1000; 

window.setTimeout(hello, delay); 

Einfach, oder? Underscore.js ist manchmal ziemlich nutzlos. Ehrlich gesagt, window.setTimeout ist perfekt genau so, wie es ist.


Hier ist ein weiteres Beispiel dafür, wie eine arg auf die Funktion

var Cat = function(name) { 
    function meow(message) { 
    console.log(name, "says meow!", message); 
    } 
    this.meow = meow; 
}; 

var duchess = new Cat("Duchess"); 

window.setTimeout(duchess.meow.bind(duchess, "please feed me!"), 2000); 

// 2 seconds later 
// => Duchess says meow! please feed me! 

Wenn Sie auf .bind abhängen kann nicht passieren Sie auch einen Verschluss

window.setTimeout(function() { 
    duchess.meow("please feed me!"); 
}, 1000); 
verwenden können

Wow, das war schwierig. Ich gehe zurück zu unterstreichen und lodash und jquery. Dieses JavaScript-Zeug ist hart!

+5

Ich verstehe Ihre Herangehensweise, aber sobald Sie die Straße einer allgemeinen Bibliothek beginnen, finden Sie bald alles umwickeln, um nicht die zugrunde liegende API (z. B. jQuery wickelt alles unter der Sonne) zu umhüllen. Andernfalls werden die Benutzer verwirrt darüber, was die Bibliothek und was ist native JS oder DOM oder was auch immer Sie abstrahieren. Nicht einen Ansatz gegenüber dem anderen unterstützen, nur sagen. – RobG

+3

Ein Bündel von Noobs stimmt das noch immer ab. Lass sie kommen, Neulinge :) – naomik

+1

Ich verstehe nicht den ganzen Hass. Du verdienst es nicht, downvoted zu werden. –

9

aes · Thet · ics

Der Autor dieser Bibliothek, der seine/ihre Freizeit zu verbringen wählte Quelle um es zu öffnen, darüber reden, es als eine Möglichkeit nutzen, um Menschen zu Javascript einzuführen und bekommen vielleicht Jemand, der einen Glühbirnenmoment um den Schließbereich herum hatte, dachte, die Attraktivität der Bibliothek sei dadurch erhöht worden.

Wenn man die Relevanz dieser Funktion isoliert betrachtet, ist das so, als würde man die Relevanz eines Gemäldes oder einer anderen handwerklichen Arbeit bestreiten. Manche mögen es, andere nicht.

Sie sind frei, es zu mögen oder nicht. Ich persönlich bevorzuge "Just-Get-to-the-Point" -Bibliotheken.

_.delay, _.defer, _.throttle, _.after haben einen Fluss IMHO, der besser als Fenster liest.

Obendrein, ich schreibe auch gerne Knoten-Server-Seite (Nodejs) und muss nicht verschieben/in/aus Modus ... versuchen Sie window.timeout in Knoten und sehen was passiert.