【发布时间】:2020-06-17 04:47:14
【问题描述】:
我正在创建一个自定义cycle.js 驱动程序,用于预加载图像。主函数导出一个接收器流imagesToLoad,发出一组图像 URL。然后由驱动程序加载它们,并且应该返回一个在图像完成加载时发出的流。
问题
我可以在驱动程序代码中订阅驱动程序返回的流,并看到加载的图像确实被发出但从主函数内部映射时不会发出。
我可能做错了什么,但我看不出到底是什么。
司机
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 ]),
}
}
【问题讨论】:
标签: javascript cyclejs