Cycle.js: 自定义 driver 不在 main() 中发出任何事件

Cycle.js: Custom driver not emitting any event inside main()

我正在创建自定义 cycle.js driver 以预加载图像。主函数导出一个接收器流 imagesToLoad 发出图像 URL 数组。然后由 driver 和 should return 加载图像加载完成时发出的流。

问题

我可以在 driver 的代码中订阅由 driver 编辑的流 return 并看到加载的图像确实被发射 但从来没有从主函数内部映射时.

我可能做错了什么,但我看不出具体是什么。

driver

import { from, Subject } from 'rxjs'
import { adapt } from '@cycle/run/lib/adapt'

const loadImage = (src) =>
    new Promise((resolve, reject) => {
        const img = new Image()
        img.addEventListener('load', () => resolve(img))
        img.addEventListener('error', (err) => reject(err))
        img.src = src
    })

export const makeImageLoaderDriver = () => {

    const imageLoaderDriver = (sink$) => {
        const imageCache = {}
        const source$ = new Subject()

        from(source$).subscribe({
            next(images) {
                const imagesPromises = images.map((src) => {
                    const imgSuccess = { src, loaded: true }
                    if (!!imageCache[src]) return Promise.resolve(imgSuccess)
                    return loadImage(src)
                        .then(() => {
                            imageCache[src] = imgSuccess
                        })
                        .catch((error) => {
                            imageCache[src] = { src, loaded: false, error }
                        })
                })

                Promise.all(imagesPromises).then(() => {
                    source$.next(imageCache)
                })
            },
        })

        return adapt(source$)
    }

    return imageLoaderDriver
}

index.js

const drivers = {
    imagesToLoad: makeImageLoaderDriver(),
}

run(main, drivers)

主要功能

export function main(sources) {

    sources.imagesToLoad.pipe(map(console.log)) // THIS NEVER LOGS ANYTHING

    return {
        imagesToLoad: of([ imageUrl1, imageUrl2 ]),
    }
}

sources.imagesToLoad.pipe(map(console.log)) 创建一个新的 Observable,但是这个 Observable 没有命名(作为 const)并且没有在其他任何地方使用。它刚刚被删除并且从未订阅过,因此 main 中的那一行实际上什么都不做。

它需要插入其他流管道之一,该流管道将以某种方式最终进入 接收器。例如,获取该操作的输出,将其命名为 const,然后在另一个流管道中使用该 const 流,并且该流管道最终必须在接收器中结束。

要调试,您可以将 .subscribe() 放在 map 之后,您很可能会看到 console.log 发生。只是不要在代码中留下 subscribe(),因为 Cycle.js 是一个框架,您永远不需要在 main 端订阅,因为订阅是针对驱动程序端的。

另请注意,您的驱动程序将 sink$ 作为输入,但它从不使用它。您应该订阅 sink$ 并根据其排放执行效果。