2014-11-06 9 views
5

Wygląda na to, że wywołanie .bind (this) na dowolnej funkcji generatora przerywa moją zdolność sprawdzenia, czy funkcja jest generatorem. Wszelkie pomysły, jak to naprawić?Czy nie można stwierdzić, czy funkcja jest funkcją generującą, jeśli wywołano na niej funkcję .bind()?

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() zwraca nową funkcję. prosta funkcja, bez powiązań z przeszłością – dandavis

+1

Może to być interesujące, aby zobaczyć, jak to robią: https://www.npmjs.org/package/generator-bind – jfriend00

+0

możliwy duplikat [sprawdź, czy funkcja jest generatorem ] (http://stackoverflow.com/questions/16754956/check-if-function-is-a-generator) –

Odpowiedz

6

Od .bind() zwraca nowy (skrótowe) funkcja, która dopiero nazywa oryginał .apply() w celu zamocowania właściwą wartość this, to oczywiście nie jest już twój generator i to jest źródłem problemu. Jest to rozwiązanie w tym module węzła: .

Możesz użyć tego modułu tak jak jest lub przekonać się, jak go rozwiązuje (w zasadzie wykonują one nową funkcję, którą .bind() zwraca również jako generator).

+1

Zwi zany generator jest nadal generatorem, jak mo na testowa z wydajno ci *. Poniżej zamieściłem swoją odpowiedź. (aby być uczciwym, możliwe jest, że korekta została dokonana od 1,5 roku temu) – niry

1

Tak, to jest możliwe, aby stwierdzić, czy funkcja jest generator nawet jeśli .bind() został powołany na to:

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