You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

35 lines
949 B

  1. //
  2. // Promise+Retry.swift
  3. // then
  4. //
  5. // Created by Sacha Durand Saint Omer on 22/02/2017.
  6. // Copyright © 2017 s4cha. All rights reserved.
  7. //
  8. import Foundation
  9. extension Promise {
  10. public func retry(_ nbOfTimes: UInt) -> Promise<T> {
  11. guard nbOfTimes > 0 else {
  12. return Promise.reject(PromiseError.retryInvalidInput)
  13. }
  14. let p = newLinkedPromise()
  15. self.numberOfRetries = nbOfTimes
  16. self.syncStateWithCallBacks(
  17. success: { [weak self] t in
  18. self?.numberOfRetries = 0
  19. p.fulfill(t)
  20. },
  21. failure: { [weak self] e in
  22. self?.numberOfRetries -= 1
  23. if self?.numberOfRetries == 0 {
  24. p.reject(e)
  25. } else {
  26. self?.resetState()
  27. self?.start()
  28. }
  29. },
  30. progress: p.setProgress)
  31. return p
  32. }
  33. }