1

在过去的几天里,我花了很多时间来让我的代码工作,但我不能让它工作!

我想要完成的是使用 es6 代理链接生成器函数,如下所示。似乎我可以将这些列表操作函数添加到生成器原型中,但我想使用代理来代替我的学习目的。

我最终想要实现的东西

rangeGenerator
    .map('project function here')
    .filter('predicate function here')
    .forEach('do some last work');

任何人都可以看看我下面的代码并告诉我我做错了什么以及如何解决这个问题吗?

谢谢!!

我的代码

function range(end) {
    return function* rangeGf() {
        for (let i = 1; i <= end; i++) {
             yield i;
        }
    }
}

const makeHandler = (options) => {

    const handler = {
        get: function(target, property, resolver) {
            if (property === 'map') {
                return map.bind(target);
            }

            if (property === 'filter') {
                return filter.bind(target);
            }
        }
    };

    function map(project) {
        console.log('project', project);
        const newTarget = this;

        function* mapGf() {
            for (let v of newTarget()) {
                yield v * 2; //hard coding for now...
            }
        }
        // return generator object wrapped by proxy
        return new Proxy(mapGf(), handler);
    }

    function filter(predicate) {
        console.log('predicate', predicate);
        const newTarget = this;

        function* filterGf() {
            for (let v of newTarget) {
                if(v % 3 === 0) { //hard coding for now...
                    yield v; 
                }
            }
        }

        // return generator object wrapped by proxy
        return new Proxy(filterGf(), handler);
    } 

    return handler;

};

const rangeGf = range(10);

const $range = new Proxy(rangeGf, makeHandler())

// for now, I'm trying to make this simple one work!
for (var i of $range.map('project')) {
  console.log(i)
}

现在,我想让这部分工作

for (var i of $range.map('project')) {
    console.log(i)
}
4

0 回答 0