2017-05-12 2 views
0

Compte tenu des méthodes suivantes:PromiseKit: composer deux promesses dans un

func loadFromCache(url: URL) -> Promise<Array<StockItem>> 
func loadFromNetwork(url: URL) -> Promise<Array<StockItem>> 

J'ai mis en place une méthode qui retourne une nouvelle promesse, en essayant le cache d'abord, puis le réseau comme suit

func load(skip: Int, query: String?, onlyInStock: Bool = false) -> Promise<Array<StockItem>> { 

    let url = self.urlFor(skip: skip, query: query, onlyInStock: onlyInStock) 
    print("Loading: \(url)") 

    return Promise { fulfill, reject in 
     self.loadFromCache(url: url).then { (items) in 
      return fulfill(items) 
     }.catch { (error) in 
      self.loadFromNetwork(url: url).then { (items) in 
       fulfill(items) 
      }.catch { (error) in 
       reject(error) 
      } 
     } 
    } 
} 

Je pense qu'il doit y avoir une meilleure façon d'écrire la méthode ci-dessus. Comment puis-je l'écrire comme une chaîne de promesses appropriée, sans les fermetures imbriquées? En d'autres termes, comment puis-je composer deux promesses en une seule?

+0

connexes? http://stackoverflow.com/questions/7040844/applicatives-compose-monads-dont –

Répondre

2

Ce que vous cherchez est l'opérateur recover.

func load(skip: Int, query: String?, onlyInStock: Bool = false) -> Promise<[StockItem]> { 
    let url = urlFor(skip: skip, query: query, onlyInStock: onlyInStock) 
    return loadFromCache(url: url).recover { _ in 
     return loadFromNetwork(url: url) 
    } 
}