Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Proposal: Progress for all, any, when #35

Closed
ghost opened this issue Apr 14, 2018 · 6 comments
Closed

Proposal: Progress for all, any, when #35

ghost opened this issue Apr 14, 2018 · 6 comments

Comments

@ghost
Copy link

ghost commented Apr 14, 2018

Hi,

It will be very useful if we have progress: Progress? = nil as last argument to Extensions that get an array of promises like all, any, when

@shoumikhin
Copy link
Contributor

Hi @umbri,

Any usage examples?

@ghost
Copy link
Author

ghost commented Apr 17, 2018

let progress = Progress(totalUnitCount: 4) // promises count

when([
    Promise<String> { fulfill, reject in
        DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
            print("1")
            
            progress.completedUnitCount += 1
            fulfill("1")
        })
    },
    
    Promise { fulfill, reject in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
            print("2")
            
            progress.completedUnitCount += 1
            fulfill("2")
        })
    },
    
    Promise { fulfill, reject in
        DispatchQueue.main.asyncAfter(deadline: .now() + 3, execute: {
            print("3")
            
            progress.completedUnitCount += 1
            fulfill("3")
        })
    },
    
    Promise { fulfill, reject in
        DispatchQueue.main.asyncAfter(deadline: .now() + 4, execute: {
            print("4")
            
            progress.completedUnitCount += 1
            fulfill("4")
        })
    }
    ])
    .then({ (_) in
        print("DONE")
    })

@shoumikhin
Copy link
Contributor

Thank you!

But I don't see a progress passed as an argument to when, as you proposed.
The example above can be rewritten as the following without any changes to the Promises APIs:

func subtask(_ overallProgress: Progress) -> Promise<Void> {
  let progress = Progress(totalUnitCount: 10, parent: overallProgress, pendingUnitCount: 1)
  return Promise<Void> {
    guard isEverythingStillOK else {
      progress.cancel()
      throw MyError.somethingIsNotOK
    }
    progress.completedUnitCount = progress.totalUnitCount // Complete the child progress
    return ()
  }
}

let overallProgress = Progress(totalUnitCount: 2)
when(subtask(overallProgress), subtask(overallProgress)).then { _ in
  // At least one subtask has succeeded
}
// Observe overallProgress.fractionCompleted

@ghost
Copy link
Author

ghost commented Apr 17, 2018

@shoumikhin Sorry, I just added an example where this can be useful, I thought it will be a syntax sugar for someone who need Progress

i think something like this:

when([Promise<T>], progress: Progress? = nil)

@shoumikhin
Copy link
Contributor

I do like the general idea. Although, at the moment, I believe it should be more involving than just passing an existing progress object to Promises APIs. Because if we went that way, that wouldn't be a big win, because one could track the progress separately, as I showed above. It's just not worth complicating the library APIs for something rarely used, that can be easily achieved the other clear way. But embedding progress reporting and cancellation into Promises would be great. We even have some prototypes internally and still working on that. Once we have anything working, I'll follow up here.

@ghost
Copy link
Author

ghost commented Apr 17, 2018

Thank you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant