2014-11-06 14 views
5

Hình như gọi .bind (this) trên bất kỳ chức năng máy phát nào phá vỡ khả năng của tôi để xem chức năng có phải là máy phát hay không. có ý tưởng nào để sửa cái này không?Có thể không biết một hàm có phải là một hàm máy phát nếu .bind() đã được gọi trên nó không?

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() trả về một chức năng mới. một chức năng đơn giản, không có mối quan hệ với quá khứ – dandavis

+1

Có lẽ điều này sẽ được quan tâm để xem cách họ làm điều đó: https://www.npmjs.org/package/generator-bind – jfriend00

+0

có thể trùng lặp của [kiểm tra nếu chức năng là một máy phát điện ] (http://stackoverflow.com/questions/16754956/check-if-function-is-a-generator) –

Trả lời

6

Kể từ .bind() trả về một chức năng (stub) mới mà chỉ gọi ban đầu với .apply() để đính kèm các giá trị thích hợp this, nó rõ ràng là không còn máy phát điện của bạn và đó là nguồn gốc của vấn đề của bạn.

Có một giải pháp trong mô-đun nút này: https://www.npmjs.org/package/generator-bind.

Bạn có thể sử dụng mô-đun đó hoặc xem cách chúng giải quyết nó (về cơ bản chúng làm cho hàm mới là .bind() cũng trả về là trình tạo).

+1

Một máy phát điện bị ràng buộc vẫn là một máy phát điện, như có thể được kiểm tra với năng suất *. Tôi đã đăng câu trả lời của mình bên dưới. (công bằng, có thể một sự điều chỉnh đã được thực hiện từ 1,5 năm trước) – niry

0

Gói này có giải pháp:

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

Về cơ bản, để có được nó để làm việc bạn có cần phải polyfill Function.prototype.bind hoặc gọi một phương thức tùy chỉnh bind().

1

Vâng, nó có thể cho biết nếu một chức năng là một máy phát điện ngay cả khi .bind() đã được gọi vào nó:

function testIsGen(f) { 
    return Object.getPrototypeOf(f) === Object.getPrototypeOf(function*() {}); 
} 
Các vấn đề liên quan