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

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