为什么我的RxJS Observable立即完成?

时间:2016-05-30 04:30:47

标签: node.js express reactive-programming observable rxjs5

我对RxJS有点新鲜,它正在踢我的屁股,所以我希望有人可以提供帮助!

我在快速服务器上使用RxJS(5)来处理我必须保存一堆Document个对象然后将每个对象通过电子邮件发送给其接收者的行为。我的documents/create端点中的代码如下所示:

    // Each element in this stream is an array of `Document` model objects: [<Document>, <Document>, <Document>] 
    const saveDocs$ = Observable.fromPromise(Document.handleCreateBatch(docs, companyId, userId));

    const saveThenEmailDocs$ = saveDocs$
      .switchMap((docs) => sendInitialEmails$$(docs, user))
      .do(x => {
        // Here x is the `Document` model object
        debugger;
      });

    // First saves all the docs, and then begins to email them all.
    // The reason we want to save them all first is because, if an email fails,
    // we can still ensure that the document is saved
    saveThenEmailDocs$
      .subscribe(
        (doc) => {
          // This never hits
        },
        (err) => {},
        () => {
          // This hits immediately.. Why though?
        }
      );

sendInitialEmails$$函数返回一个Observable,如下所示:

  sendInitialEmails$$ (docs, fromUser) {
    return Rx.Observable.create((observer) => {

      // Emails each document to their recepients
      docs.forEach((doc) => {
        mailer.send({...}, (err) => {
          if (err) {
            observer.error(err);
          } else {
            observer.next(doc);
          }
        });
      });

      // When all the docs have finished sending, complete the
      // stream
      observer.complete();
    });
  });

问题在于,当我订阅saveThenEmailDocs$时,我的next处理程序永远不会被调用,而是直接转到complete。我不知道为什么......反过来如果我从observer.complete()删除sendInitialEmails$$调用,每次调用next处理程序,并且从不调用subscribe中的complete处理程序

为什么next next complete的预期行为发生了,而不是它的一个......我错过了什么?

1 个答案:

答案 0 :(得分:0)

我只能假设mailer.send是异步调用。 当所有异步调用都已启动时,但在任何异步调用完成之前,都会调用observer.complete()

在这种情况下,我会从docs数组中创建一个可观察值的流,而不是像这样包装它。

或者,如果您想将其手动包装到一个observable中,我建议您查看库异步并使用

async.each(docs, function(doc, callback) {...}, function finalized(err){...})