使用带有 Swift 标准网络的 PromiseKit 处理拒绝?

Posted

技术标签:

【中文标题】使用带有 Swift 标准网络的 PromiseKit 处理拒绝?【英文标题】:Handling reject with PromiseKit with Swift standard networking? 【发布时间】:2017-11-06 19:37:27 【问题描述】:

我有一个小函数,它使用本机解决方案来解析和解码 JSON。一切正常,除了处理错误。我知道当错误发生时,我应该得到带有 errormessage

的 JSON
 func fetchCardDetails(withNumber number: Int) -> Promise<CardDetails> 
    guard let URL = URL(string: "\(URLProvider.url)/\(APIKeyProvider.apiKey)/\(number)/") else 
        fatalError("Could not reformat string to URL!")
    
    var request = URLRequest(url: URL)
    request.httpMethod = "GET"

    let decoder = JSONDecoder()
    let session = URLSession.shared

    return Promise  fullfill, reject in

        let dataTask = session.dataTask(with: request)  data, response, error in
            if let data = data,
               let json = (try? decoder.decode(CardDetails.self, from: data)) 
                fullfill(json)
             else if let error = error 
                reject(error)
             else if let response = response 
                print(response)
             else if data != nil 
                let data = NSError()
                reject(data)
             else 
                reject(PMKError.invalidCallingConvention)
            
        
        dataTask.resume()
    


func fetchCardDetails(number: Int) 
    _ = cardDetailsService.fetchCardDetails(withNumber: number).then  cardDetails -> Void in

       //some actions with cardDetails
    

收到错误时 - 没有崩溃,但我收到错误 Pending Promise 已解除分配!这通常是一个错误。常问问题。不过来自 PromiseKit 并没有帮助我。

我是否应该解码错误的 JSON 并更改整个 reject 闭包?

【问题讨论】:

【参考方案1】:

if 声明的这一部分既不满足也不拒绝。

else if let response = response 
    print(response)

如果您既不履行也不拒绝,则承诺永远不会解决,如果未解决的承诺被解除分配,它会将您看到的警告打印到控制台。

有关详细信息,请参阅 PromiseKit 故障排除指南。

【讨论】:

以上是关于使用带有 Swift 标准网络的 PromiseKit 处理拒绝?的主要内容,如果未能解决你的问题,请参考以下文章

Swift,带有完成处理程序的网络调用不起作用

带有可编码数组的 swift 5 抽象网络响应

等到带有异步网络请求的 swift for 循环完成执行

带有 XML 响应和正文的 SOAP 请求 swift 3,Alamofire

无法使用 Xcode 7.3.1 在我的 Swift 2 项目中检查带有“po”的变量 - 加载辅助函数时出错

带有 NSURLSession 的 Swift 中的 HTTP 请求