给定具有生成器功能的ES6类,如何从ES5代码运行该生成器函数:
class GeneratorClass {
constructor() {
this.ary = [1, 2, 3];
}
*[Symbol.iterator]() {
for (let el of this.ary) {
yield el;
}
}
}
// This runs fine transcompiled (traceur)
var iterableObj = new GeneratorClass();
for (let el of iterableObj) {
console.log(el);
}
从ES5测试框架:
TestCase('GeneratorClassTest', {
setUp: function () {
console.log('in setup');
var iterableObj = new GeneratorClass();
for (var el in this.iterableObj) {
console.log(el);
}
},
testConstructor: function() {
}
});
这不会抛出任何错误,会运行setup函数,但不会遍历数组。
答案 0 :(得分:1)
如果您只需要运行时只支持ES5的ES6模块,则无法执行此操作。
但是如果您使用babel或traceur将ES6模块编译到ES5中然后需要编译模块 - 您可以在ES5运行时测试您的生成器。不要使用for of
循环,使用iteratorObj
方法创建Symbol.iterator
,使用迭代器的when
循环和next
方法。
对于你的例子:
TestCase('GeneratorClassTest', {
setUp: function () {
console.log('in setup');
var generator = new GeneratorClass();
var next, iterableObj = generator[Symbol.iterator]();
while ((next = iterableObj.next()) && !next.done) {
console.log(next.value);
}
},
testConstructor: function() {
}
});