代码之家  ›  专栏  ›  技术社区  ›  user6791424

如何返回可观察到的。mongo光标查询中的fromEvent?

  •  1
  • user6791424  · 技术社区  · 6 年前

    我有一个函数,它执行查询并从查询返回的游标事件中返回一个可观察的:

    exports.query_tokens = (db) => {
      var req = db.collection('collectionName').find({});
      return Rx.Observable.fromEvent(req, 'data');
    }
    

    我是这样使用的:

    ...
    do(mongo_functions.query_tokens).
    subscribe(console.log);
    

    但我在控制台中看到了:

    Db {
    nodejs                    |   domain: null,
    nodejs                    |   _events: {},
    nodejs                    |   _eventsCount: 0,
    nodejs                    |   _maxListeners: undefined,
    nodejs                    |   s: 
    nodejs                    |    { databaseName: 'myDatabase',
    nodejs                    |      dbCache: {},
    nodejs                    |      children: [],
    nodejs                    |      topology: 
    nodejs                    |       Server {
    nodejs                    |         domain:
    ...
    

    正如你所见,它们不是我的文件。我做错了什么?

    如您所见,Curso实际上触发了一个名为data的事件: http://mongodb.github.io/node-mongodb-native/3.0/api/Cursor.html#event:data

    2 回复  |  直到 6 年前
        1
  •  2
  •   Picci    6 年前

    我发现使用以下代码更方便

    export function findObs(collection: Collection<any>, queryConditions?: any) {
        const queryObj = queryConditions ? queryConditions : {};
        const queryCursor = collection.find(queryObj);
        return Observable.create((observer: Observer<Array<ObjectID>>): TeardownLogic => {
                                queryCursor.forEach(
                                    doc => observer.next(doc),
                                    () => observer.complete()
                                )
                            })
    }
    

    原因是 Observable.from 忽略 “完成” 事件,因此您永远不能输入 “未完成” 订阅者的功能。

    另一方面,使用 Observable.create 允许控制光标的完成,从而触发 “未完成” 订阅者的功能。

        2
  •  0
  •   cartant    6 年前

    这个 do 操作员接收可观察到的 next , error complete 通知,但对可观察对象没有影响。即,从 操作员的 下一个 函数被忽略。因此,函数被传递给 subscribe 接收 Db .

    而不是 ,您最可能要使用 switchMap ,将可观察到的事件平坦化为可观察到的流:

    ...
    .switchMap(mongo_functions.query_tokens)
    .subscribe(console.log);