因为fromEvent(image, 'load')
在第一个 sub-observable 上没有完成,其他 sub-observable 一直在等待。所以你应该在第一个事件之后完成 sub-observable。
使用take(1)
.
摘自您的第二个片段
...
var loadedImageStream = Rx.Observable
.fromEvent(image, 'load')
.map(function() {
return image;
})
...
添加 take(1) 以完成 sub-observable
...
var loadedImageStream = Rx.Observable
.fromEvent(image, 'load')
.map(function() {
return image;
})
.take(1)
...
编辑:
使用concatMap
使得加载图像顺序,所以它很慢。
如果你通过了index
,你可以使用replace
而不是append
来保持顺序。在这种情况下,您可以使用flatMap
,它可以实现快速并发加载。
$(function () {
var imageURLList = [
'https://placehold.it/500x100',
'https://placehold.it/500x200',
'https://placehold.it/500x300',
'https://placehold.it/500x400',
'https://placehold.it/500x500'
];
var imagesDOM = $('#images');
Rx.Observable
.fromArray(imageURLList)
.do(function (imageURL) {
imagesDOM.append(new Image()); // placeholder
})
.flatMap(function (imageURL, index) {
var image = new Image();
var loadedImageStream = Rx.Observable
.fromEvent(image, 'load')
.map(function () {
return [image, index];
})
.take(1)
image.src = imageURL;
return loadedImageStream;
})
.subscribe(function (image_index) {
var image = image_index[0];
var index = image_index[1];
imagesDOM.children().get(index).replaceWith(image);
})
})