【发布时间】:2021-01-31 21:25:56
【问题描述】:
我有这个函数,它返回一个可观察的,它发出一个 deviceId 及其相关的 MediaStream:
private getStreamToDeviceId(deviceKind: "audioinput" | "videoinput") {
return from(navigator.mediaDevices.enumerateDevices()).pipe(
map((devices) =>
devices
.filter((device) => device.kind === deviceKind)
.map((device) => device.deviceId)
),
take(1),
concatMap((deviceIds) => of(...deviceIds)),
concatMap((deviceId) =>
zip(
of(deviceId),
from(
navigator.mediaDevices.getUserMedia({
audio: deviceKind === "audioinput" ? { deviceId } : false,
video: deviceKind === "videoinput" ? { deviceId } : false,
})
).pipe(take(1))
)
),
);
}
我想在最后加上一个take(devicesNumber),但是,如果我尝试在take(1) 之后将devicesNumber 设置为一个水龙头,它不起作用。
我该怎么做?
另外,我使用的那些take(1) 对自动退订真的有帮助吗?
【问题讨论】:
-
很难知道您要达到的目标。 1 次发射后取消订阅。你包装了一个承诺,所以你真的不需要第二次 take() 因为承诺只发出和完成一次。
-
很高兴了解
take(1)。我想要实现的是在所有拉链都被触发后完成 observable。应用启动时只获取一次流 -
如果我没记错的话,默认情况下会发生这种情况。当您订阅函数的结果时。它将触发调用,然后在所有内部可观察对象完成时完成。您的第一个
take(1)也只会导致一次发射。流只被使用一次,因为它们源自只会完成一次的 Promise。