我正在使用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'}
值。
所以我想知道我做错了什么。
答案 0 :(得分:1)
每个mult
等待所有tap
消耗有效载荷,然后再移动到下一个。在这种情况下,它正在等待2个水龙头,而它们又在等待它。