Как обработать функцию, которая должна возвращать Observable, только если проверка прошла успешно? - PullRequest
0 голосов
/ 05 ноября 2019

Надеюсь, это не слишком основано на мнении. Я думаю, что может быть лучшая практика, о которой я не знаю, или механизм, о котором я не знаю, или я, по крайней мере, хотел бы лучше понять плюсы и минусы возможных решений.

Скажем, у меня есть эти функции в службе Angular, которая называется ImportService, которая обрабатывает всю логику импорта:

  /** Only call this after calling validateImportFile and getting back true! */
  new(file: File): Observable<ImportResource> { 
    return this.apiService.importCreate(file);
  }

  validateImportFile(file: File): Boolean {
    //some validation logic
  }

Если бы TypeScript был больше похож на Java, я бы предпочел сделать что-то более похожее на:

  new(file: File): Observable<ImportResource> throws ImportValidationError {
    if(this.validateImportFile(file)) {
      return this.apiService.importCreate(file);
    } else {
      throw new ImportValidationError("Your file is bad and you should feel bad");
    }
  }

  private validateImportFile(file: File): Boolean {
    //some validation logic
  }

Чтобы вызывающие абоненты могли делать что-то более похожее на

try {
  importService.new(aFile).subscribe( importInfo => {
    //Display stuff about importInfo
  }, error => {
    //There was some kind of http error
  });
} catch (ImportValidationError e) {
    //There was something wrong with the file itself
}

Основными преимуществами являются

  • new (), которые будут всегда проверяться, и вызывающие абоненты не должнызнать / не забывать вызывать validate вначале
  • подпись new () четко сообщает вызывающим абонентам, что они должны обработать сбой проверки
  • вызывающие new () могут легко отличить случай сбоя проверкии какой-то другой случай сбоя

, но из того, что я прочитал, выбрасывание ошибок таким образом является своего рода анти-паттерном в TypeScript прямо сейчас, потому что вы не можете поместить "throws"объявление в сигнатуре, чтобы предупредить вызывающих абонентов об этом, и компилятор не будет ожидать, что вызывающие абоненты его поймают, поэтому все эти преимущества потеряны.

Если вместо этого я возвращаю наблюдаемую ошибку, я не думаю, что вызывающие абоненты могут знать, что они ожидают ошибки определенного типа именно для ошибки проверки.

Другой вариант - вернуть объект-обертку, который указывает, была ли ошибка, и содержит наблюдаемую только в случае успеха, но это кажется загроможденным и достаточно окольным, поэтому мне нужно задаться вопросом, есть ли лучший способ. Есть ли?

1 Ответ

0 голосов
/ 06 ноября 2019

Функциональное реактивное программирование действительно работает в совершенно ином мышлении, в FRP ваш код может быть таким же простым, как и следующий. Используйте throwError от rxjs

const createNew=(file)=>
    this.validateImportFile(file)?
        throwError(new ImportValidationError("Your file is bad and you should feel bad")):
        this.apiService.importCreate(file);

использование

   createNew(yourfile).subscribe(()=>console.log('sucess'),err=>console.log(error))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...