在任何生成器函数上调用.bind(this)都会破坏我查看该函数是否为生成器的能力。关于如何解决这个问题有什么想法吗?
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(/^functions**/.test(fn.toString())) {
isGenerator = true;
}
return isGenerator;
}
var myGenerator = function*() {
}
var myBoundGenerator = myGenerator.bind(this);
isGenerator(myBoundGenerator); // false, should be true
由于.bind()
返回了一个新的(存根)函数,该函数只使用.apply()
调用原始函数,以便附加正确的this
值,因此它显然不再是您的生成器,这就是问题的根源。
此节点模块中有一个解决方案:https://www.npmjs.org/package/generator-bind.
您可以按原样使用该模块,也可以查看它们是如何解决的(基本上,它们使.bind()
返回的新函数也成为生成器)。
是的,即使调用了.bind(),也可以判断函数是否是生成器:
function testIsGen(f) {
return Object.getPrototypeOf(f) === Object.getPrototypeOf(function*() {});
}
此包具有以下解决方案:
https://www.npmjs.org/package/generator-bind
基本上,为了使其工作,您需要polyfill Function.prototype.bind或调用自定义bind()方法。