js-csp operations.mult不会跨通道分配值

时间:2015-04-26 20:24:27

标签: javascript ecmascript-6 js-csp

我正在使用js-csp库并且它具有mult功能。我设置了一个测试,其中包含一个源通道,一对多通道和一个结果通道。然而,不知何故并非所有价值观都分配到渠道。这是代码:

import csp from 'js-csp';

describe('Dispatcher', function() {
    let source, broadcast, listeners, result;

    beforeEach(function() {
        source = csp.chan();

        broadcast = csp.operations.mult(source);

        result = csp.chan();
        csp.operations.mult.tap(broadcast, result);

        listeners = Array(csp.chan(), csp.chan(), csp.chan()).map((chan) => {
            csp.operations.mult.tap(broadcast, chan);
            return chan;
        });
    });

    it('should broadcast the payload to all listeners', function(done) {
        this.timeout(0);

        let counter = 0;
        csp.go(function*() {
            let payload = yield result;
            while (payload !== csp.CLOSED) {
                console.log('[result]', payload);
                if (payload.name === 'done') {
                    counter++;
                    console.log('[result]', counter);
                    if (counter === listeners.length) {
                        done();
                    }
                }
                payload = yield result;
            }
        });

        listeners.forEach((chan, idx) => {
            csp.go(function*() {
                let payload = yield chan;
                while (payload !== csp.CLOSED) {
                    if (payload.name !== 'done') {
                        console.log('[listener]', payload);
                        yield csp.put(source, {name: 'done'});
                    }
                    payload = yield chan;
                }
            });
        });

        csp.putAsync(source, {name: 'test'}, () => console.log('putAsync callback'));
    });
});

我正在使用Webpack和Babel.js及其版本的Renegerator将此代码转换为ES5。运行后(在浏览器中),{name: 'test'}邮件会发送到每个频道,但{name: 'done'}只会传送到result频道一次。

我在调试器中检查了source频道,它有一个puts缓冲区,其中包含两个剩余的{name: 'done'}值。

所以我想知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

每个mult等待所有tap消耗有效载荷,然后再移动到下一个。在这种情况下,它正在等待2个水龙头,而它们又在等待它。