合并处理不同类型的发布者

时间:2020-11-03 11:15:20

标签: swift networking combine

我真的很想合并,并且一直困扰着这个问题。我有基本的注册表单,如果一切正常,则返回带有200个代码的空响应,如果表单存在某些注册失败,则返回442。

那是可以处理空响应并且可以正常工作的代码

   <div [formGroup]="form">
      <div formArrayName="{{ field.name }}">
        <div *ngFor="let frm of formArray.controls; index as idx">
          <div formGroupName="{{ idx }}">
            <div *ngFor="let obj of arrayFileds;">
              <input
                attr.type="{{ obj.type }}"
                class="form-control"
                placeholder="{{ obj.name }}"
                id="{{ obj.name }}"
                name="{{ obj.name }}"
                formControlName="{{ obj.name }}"
              />
            </div>
            <hr />
          </div>
        </div>
      </div>
    </div>

但是,如何退回其他类型的发布商?例如

idx

我的网络通话:

extension Route where ResultType: EmptyResult {
    func emptyResult() -> AnyPublisher<Void, APIError> {
        return URLSession.shared.dataTaskPublisher(for: urlRequest)
            .print("EMPTY RESULT")
            .tryMap { data, response in
                guard let httpResponse = response as? HTTPURLResponse else { throw APIError.nonHttpResponse(description: "Not http resp") }
                let statusCode = httpResponse.statusCode
                
                guard (200..<300).contains(statusCode) else { throw APIError.nonHttpResponse(description: "bad response")
                }
                    return Void()
            }.mapError { error in
                print("Error \(error)")
                return .network(description: error.localizedDescription)
            }
            .eraseToAnyPublisher()
    }
}

1 个答案:

答案 0 :(得分:1)

因此,您有一个网络请求,在请求成功的情况下,将返回200响应和一个空主体,而在出现表单错误的情况下,它将返回特定的状态码和响应中的错误。

我建议您将Output的{​​{1}}类型保留为Publisher,但是,如果出现格式错误,请解码错误并将其作为{{1 }}。

Void

然后,您可以通过APIError中的struct LoginError: Decodable { let usernameError: String let emailError: String } enum APIError: Error { case failureStatus(code: Int) case login(LoginError) case nonHttpResponse(description: String) case network(Error) } func emptyResult() -> AnyPublisher<Void, APIError> { return URLSession.shared.dataTaskPublisher(for: urlRequest) .print("EMPTY RESULT") .tryMap { data, response in guard let httpResponse = response as? HTTPURLResponse else { throw APIError.nonHttpResponse(description: "Not http response") } let statusCode = httpResponse.statusCode guard (200..<300).contains(statusCode) else { if statusCode == 442 { let loginError = try JSONDecoder().decode(LoginError.self, from: data) throw APIError.login(loginError) } else { throw APIError.failureStatus(code: statusCode) } } return Void() }.mapError { error in switch error { case let apiError as APIError: return apiError default: return .network(error) } } .eraseToAnyPublisher() } 遍历switch来处理特定错误:

error