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:
Isiah Meadows 2020-06-16 08:36:40 -07:00 committed by GitHub
parent cf7a841c4c
commit 31d1df5caa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 1 deletions

View file

@ -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.

View file

@ -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())
}
}

View file

@ -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() {