Fix issue where ending a stream in the middle of a stream callback would result in erroneous parent stream state for the rest of that emit.
This commit is contained in:
parent
cf7a841c4c
commit
31d1df5caa
3 changed files with 40 additions and 1 deletions
|
|
@ -30,6 +30,7 @@
|
|||
- Add `m.censor`. ([#2538](https://github.com/MithrilJS/mithril.js/pull/2538) [@isiahmeadows](https://github.com/isiahmeadows))
|
||||
- Re-add stream bundles. ([#2539](https://github.com/MithrilJS/mithril.js/pull/2539) [@isiahmeadows](https://github.com/isiahmeadows))
|
||||
- Remove extra isLifecycleMethod call from removeAttr. ([#2594](https://github.com/MithrilJS/mithril.js/pull/2594) [@ZeikJT](https://github.com/zeikjt))
|
||||
- Fix issue where ending a stream in the middle of a stream callback would result in erroneous parent stream state for the rest of that emit. ([#2603](https://github.com/MithrilJS/mithril.js/pull/2603) [@isiahmeadows](https://github.com/isiahmeadows))
|
||||
|
||||
Important note: if you were using any of these undocumented tools, they are no longer available as of this release. This is not considered a breaking change as they were written for internal usage and as of v2 are all 100% unsupported in userland.
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,11 @@ function Stream(value) {
|
|||
if (open(stream)) {
|
||||
stream._changing()
|
||||
stream._state = "active"
|
||||
dependentStreams.forEach(function(s, i) { s(dependentFns[i](value)) })
|
||||
// Cloning the list to ensure it's still iterated in intended
|
||||
// order
|
||||
dependentStreams.slice().forEach(function(s, i) {
|
||||
if (open(s)) s(this[i](value))
|
||||
}, dependentFns.slice())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -494,6 +494,40 @@ o.spec("stream", function() {
|
|||
stream(2)
|
||||
o(stream()).equals(2)
|
||||
})
|
||||
// https://github.com/MithrilJS/mithril.js/issues/2601
|
||||
o("ended stream doesn't affect emit of subsequent streams", function() {
|
||||
const refreshing = Stream()
|
||||
const o1Received = []
|
||||
const waitingReceived = []
|
||||
const o2Received = []
|
||||
const o3Received = []
|
||||
const o4Received = []
|
||||
|
||||
/* eslint-disable array-callback-return */
|
||||
refreshing.map(function(v) { o1Received.push(v) })
|
||||
|
||||
const waiting = refreshing.map(function(v) {
|
||||
waitingReceived.push(v)
|
||||
if (v === false) {
|
||||
waiting.end(true)
|
||||
}
|
||||
})
|
||||
|
||||
refreshing.map(function(v) { o2Received.push(v) })
|
||||
refreshing.map(function(v) { o3Received.push(v) })
|
||||
refreshing.map(function(v) { o4Received.push(v) })
|
||||
/* eslint-enable array-callback-return */
|
||||
|
||||
refreshing(true)
|
||||
refreshing(false)
|
||||
refreshing("more")
|
||||
|
||||
o(o1Received).deepEquals([true, false, "more"])
|
||||
o(waitingReceived).deepEquals([true, false])
|
||||
o(o2Received).deepEquals([true, false, "more"])
|
||||
o(o3Received).deepEquals([true, false, "more"])
|
||||
o(o4Received).deepEquals([true, false, "more"])
|
||||
})
|
||||
})
|
||||
o.spec("toJSON", function() {
|
||||
o("works", function() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue