javascript - rxjs'de bir async fonksiyonu 'return' kullanarak durdurmanın karşılığı
Aşağıdakine benzer bir şey uygulamak istiyorum (promises kullanılırsa kolaylar)
async doSomething(sID){
let student = await service.getStudent(sID);
let teacher = await service.getTeacher(student.TeacherID);
if(!teacher.Active){
return;
}
await service.teacherSomething(teacher);
await service.studentSomething(student);
}
Bunu, sözler yerine gözlemler kullanıyorsam nasıl yapacağıma dair hiçbir fikrim yok ama şimdiye kadar denediğim bu.
doSomething(sID){
let student;
let teacher;
service.getStudent(sID).pipe(
switchMap(studentR=>{
student = studentR;
return service.getTeacher(student.TeacherID);
}),
switchMap(teacherR=>{
teacher = teacherR;
if(!teacher.Active){
return of(null);
}else{
return service.teacherSomething(teacher);
}
}),
swicthMap(teacherSomethingResponse=>{
if(teacherSomethingResponse==null){
return of(null);
}else{
return service.studentSomething(student);
}
})
}).subscribe();
}
gördüğünüz gibi, rxjs sürümüm promise sürümüne kıyasla ÇOK UZUN görünüyor ve bunu doğru şekilde yapmadığımı hissediyorum.
Cevap #1
Mevcut kodunuzu Rx tarzına nasıl dönüştürebileceğiniz burada. takeWhile koşul karşılanmazsa gözlemlenebilirinizi tamamlayacaktır
function doSomething(sID) {
return from(service.getStudent(sID)).pipe(
switchMap(student =>
service.getTeacher(student.TeacherID).pipe(
takeWhile(teacher => teacher.Active),
switchMap(teacher => service.teacherSomething(teacher).pipe(takeWhile(res => res))),
switchMap(() => service.studentSomething(student))
)
))
}
Cevap #2
async/await genellikle okunabilirlik özelliği olarak geliştirilmiştir, bu yüzden görsel olarak oldukça kısa olması doğaldır. Eski tip Promise sözdizimini kullanırsanız, çok daha uzun bir fonksiyon elde edersiniz. Yani, kısaca - gözlemleri doğru şekilde kullanıyorsunuz ve uzunluk, beklenen sözdizimi farklılıklarından kaynaklanıyor.
