2014-11-06 7 views
5

Sieht so aus, als würde das Aufrufen von .bind (this) bei jeder Generatorfunktion meine Fähigkeit zu sehen, ob die Funktion ein Generator ist, unterbrechen. Irgendwelche Ideen, wie das zu beheben ist?Ist es unmöglich, zu erkennen, ob eine Funktion eine Generatorfunktion ist, wenn .bind() aufgerufen wurde?

var isGenerator = function(fn) { 
    if(!fn) { 
     return false; 
    } 

    var isGenerator = false; 

    // Faster method first 
    // Calling .bind(this) causes fn.constructor.name to be 'Function' 
    if(fn.constructor.name === 'GeneratorFunction') { 
     isGenerator = true; 
    } 
    // Slower method second 
    // Calling .bind(this) causes this test to fail 
    else if(/^function\s*\*/.test(fn.toString())) { 
     isGenerator = true; 
    } 

    return isGenerator; 
} 

var myGenerator = function*() { 
} 

var myBoundGenerator = myGenerator.bind(this); 

isGenerator(myBoundGenerator); // false, should be true 
+2

bind() gibt eine neue Funktion. eine einfache Funktion, ohne Bindungen an die Vergangenheit – dandavis

+1

Vielleicht wäre dies von Interesse, um zu sehen, wie sie es tun: https://www.npmjs.org/package/generator-bind – jfriend00

+0

mögliche Duplikate von [überprüfen, ob die Funktion ein Generator ist ] (http://stackoverflow.com/questions/16754956/check-if-function-is-a-generator) –

Antwort

6

Seit .bind() eine neue (Stub) -Funktion gibt, die nur Anrufe nur das Original mit .apply(), um den richtigen this Wert zu befestigen, ist es offensichtlich nicht Ihr Generator länger und das ist die Quelle Ihrer Frage.

In diesem Knotenmodul gibt es eine Lösung: https://www.npmjs.org/package/generator-bind.

Sie können entweder dieses Modul verwenden oder sehen, wie sie es lösen (im Grunde machen sie die neue Funktion, die .bind() zurückgibt, auch ein Generator sein).

+1

Ein gebundener Generator ist immer noch ein Generator, wie mit Ausbeute * getestet werden kann. Ich habe meine Antwort unten gepostet. (um fair zu sein, ist es möglich, dass eine Korrektur vor 1,5 Jahren vorgenommen wurde) – niry

0

Dieses Paket hat die Lösung:

https://www.npmjs.org/package/generator-bind

um Grundsätzlich zu bekommen es müssen Sie entweder arbeiten Function.prototype.bind POLYfill oder eine benutzerdefinierte bind() -Methode aufrufen.

1

Ja, ist es möglich, zu sagen, wenn eine Funktion ein Generator ist, selbst wenn .bind() hat es genannt:

function testIsGen(f) { 
    return Object.getPrototypeOf(f) === Object.getPrototypeOf(function*() {}); 
}