为什么在第一个函数之前,订阅处理函数的行为与onValue不同?

时间:2017-11-14 00:47:29

标签: bacon.js

我有一个产生许多事件的流。我只想把第一个事件激活某些事情。

我的第一个想法是使用stream.first()。subscribe(activateStuff)来实现它。问题是activateStuff处理程序被调用两次。但是如果我使用onValue而不是subscribe,它将被调用一次(如预期的那样)。

有趣的是,如果我删除了第一个()部分,并且我只使用了一个被触发的事件的订阅,它将表现得像onValue(它们都只调用一次activateStuff)。

let stream1 = new Bacon.Bus();
stream1.first().onValue(() => console.log("from stream1"));
stream1.push({});
// it will print from stream1 once

let stream2 = new Bacon.Bus();
stream2.first().subscribe(() => console.log("from stream2"));
stream2.push({});
// it will print from stream2 twice. Why !?

let stream3 = new Bacon.Bus();
stream3.onValue(() => console.log("from stream3"));
stream3.push({});
// it will print from stream3 once

let stream4 = new Bacon.Bus();
stream4.subscribe(() => console.log("from stream4"));
stream4.push({});
// it will print from stream4 once

使用first()然后使用相同的事件流subscribe()有什么问题?

您可以在此处使用代码:https://fiddle.jshell.net/np0r80fn/

1 个答案:

答案 0 :(得分:0)

let currentBundle = Bundle.allBundles.filter() { $0.bundlePath.hasSuffix(".xctest") }.first! let realBundle = Bundle(path: "\(currentBundle.bundlePath)/../../../../Tests/MyProjectTests/Resources") 方法将使用Event(https://github.com/baconjs/bacon.js/#event)对象调用您的方法,而不仅仅是新值。您将获得2个回调:一个用于subscribe事件中包含的实际值,另一个用于Next事件。如果删除End部分,结果流将不会结束;这就是为什么你在这种情况下只得到一次回调。