Mongo游标的不明确RxJS可观察到的行为

时间:2018-10-04 10:28:55

标签: javascript typescript rxjs observable database-cursor

我一直在尝试编写一些代码,使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

1 个答案:

答案 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$()))
}