В RxJs есть полезный оператор (также статический метод) iif () , который, как следует из названия, работает аналогично JS if / else.
Используется в пути
iif(
() => state to check,
o1, // Observable to execute when statement is truthy
o2 // Observable to execute when statement is falsy
)
Также есть defer()
, который вам потребуется для создания наблюдаемой по требованию (в противном случае JS сначала попытается скомпилировать наблюдаемое, и это может вызвать некоторые ошибки, поэтому я использую его каждый раз, когда входящее значение используется наблюдаемой ).
Может использоваться как
iif(
() => statmenet to check,
defer(() => o1),
defer(() => o2)
)
И ваш код может быть переписан следующим образом
getRequest(attachments) {
return iif(
() => attachments.length === 0,
defer(() => this.callUpdateRequest()),
defer(() => this.callUpdateRequest().pipe(
switchMapTo(of(attachments)),
mergeMap(attachments => {
return attachments.map(attachment => {
return attachment;
});
}),
mergeMap(attachment => {
return this.attachmentsService.addAttachmentFile(attachment)
.pipe(map(fileData => {
return fileData;
}));
}),
mergeMap(fileData => {
return this.attachmentsService.addAttachment(
this.requestId, fileData.fileUrl
).pipe(
map(attachments => {
return attachments;
})
);
}),
takeLast(1)
))
);
}
onUpdateRequest() {
this.getRequest(this.attachments).subscribe(() => {
// do whatever you want
})
}
Я немного разбил ваш код, чтобы сделать его более общим и тестируемым.
P.S. Зачем писать this.attachments.length <= 0
может быть меньше 0?