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.

İlgili makaleler