我对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
的预期行为发生了,而不是它的一个......我错过了什么?
答案 0 :(得分:0)
我只能假设mailer.send
是异步调用。
当所有异步调用都已启动时,但在任何异步调用完成之前,都会调用observer.complete()
。
在这种情况下,我会从docs数组中创建一个可观察值的流,而不是像这样包装它。
或者,如果您想将其手动包装到一个observable中,我建议您查看库异步并使用
async.each(docs, function(doc, callback) {...}, function finalized(err){...})