我一直在尝试编写一些代码,使mongo光标变为可观察的对象。我在网上找到了许多解决方案,但是我尝试从零开始创建我的学习RxJS。
请有人能够解释以下代码为何在下面给出输出?
export function cursor$ <T> (cursor: Cursor<T>): Observable<T> {
let counter = 1
const d$ = (): Observable<T> => {
counter++
return from(cursor.hasNext())
.pipe(
tap(() => console.log(counter, 'before')),
concatMap(x => x ? from( <Promise<T>>cursor.next() ) : empty()),
tap(() => console.log(counter, 'between')),
expand(() => d$()),
tap(() => console.log(counter, 'after'))
)
}
return d$()
}
每个项目都记录在订阅中,并在完成时打印“完成”。
2 'before'
2 'between'
2 'after'
{ _id: 5bb5d47bbfa2d3ea077c37a6, name: 'Jeff' }
3 'before'
3 'between'
3 'after'
3 'after'
{ _id: 5bb5d483bfa2d3ea077c37a8, name: 'Jerald' }
5 'before'
5 'before'
5 'between'
5 'after'
5 'after'
{ _id: 5bb5d493bfa2d3ea077c37aa, name: 'Somebody' }
7 'between'
7 'after'
7 'after'
7 'after'
{ _id: 5bb5df8dbfa2d3ea077c39c8, name: 'Waddup' }
10 'before'
10 'before'
10 'before'
10 'before'
10 'before'
done
答案 0 :(得分:0)
排序!
问题是我在require 'nokogiri'
def find_links(link)
page = Nokogiri::HTML(open(link))
link_size = page.css('li')
(0..link_size.length).each do |index|
b = link_size[index]['href']
return b
end
end
find_links('http://code.tutsplus.com/tutorials/you-dont-know-anything-about-regular-expressions-a-complete-guide--net-7869').each do |url|
puts url
end
内调用了expand,而它本身被多次调用了。
这里有d$()
s的有效代码:
tap()
和所需的输出:
export function cursor$ <T> (cursor: Cursor<T>): Observable<T> {
let counter = 0
const next$ = () => from(cursor.hasNext())
.pipe(
tap(() => console.log(counter++, 'before')),
concatMap(x => x ? from(<Promise<T>> cursor.next()) : empty()),
tap(() => console.log(counter++, 'after')),
)
return next$().pipe(expand(() => next$()))
}