Git Product home page Git Product logo

Comments (6)

 avatar commented on April 27, 2024

#5

from promises.

shoumikhin avatar shoumikhin commented on April 27, 2024

Hi @umbri, sorry, I don't completely understand. Do you propose to reject a promise with some predefined cancelled error and provide a special catch version to handle only those? In the example above a simple shared bool flag seems sufficient...

from promises.

 avatar commented on April 27, 2024

@shoumikhin Hi,
let me show a real world example: (simplified)

     func testPromise() -> Promise<[Icon]> {
        return Promise<[Icon]>(on: .global(qos: .userInitiated)) {
            return self.loadHtml()
                .then({ (html) -> Promise<[URL]> in
                    return self.parseHtml(with: html)
                })
                .then({ (urls) -> Promise<[Icon]> in
                    return Promises.any([
                        self.faviconByUrl(urls: urls),
                        Promises.all([
                            self.faviconSmall(),
                            self.faviconAppleTouch()
                        ])
                    ])
                    .then({ (result: [Maybe<[Icon]>]) -> Promise<[Icon]> in
                        fatalError() // do some transformations here ...
                    })
                })
        }
    }
    
    func loadHtml() -> Promise<String> {
        fatalError()
    }
    
    func faviconAppleTouch() -> Promise<Icon> {
        fatalError()
    }
    
    func faviconSmall() -> Promise<Icon> {
        fatalError()
    }
    
    func faviconByUrl(urls: [URL]) -> Promise<[Icon]> {
        return Promises.all(urls.map { self.download(url: $0) })
    }
    
    func parseHtml(with: String) -> Promise<[URL]> {
        fatalError()
    }
    
    func download(url: URL) -> Promise<Icon> {
        fatalError()
    }

imagine you have something like this, and you don't know when user will cancel all this promise chain testPromise, we need a simple method to do this

from promises.

 avatar commented on April 27, 2024

I see 2 approaches here:

  1. something like this https://github.com/vadymmarkov/When#fail , but we must have access to promise state discussed here: #31 to know when to reject the long running promise, imagine: download will come in chunks, and promise is already started, we can get some chunks and the check if promise was rejected and reject downloadTask
  2. something like this:
    https://gist.github.com/umbri/7413f4c9b41cfc210561e01b6165a23e, will be used like this:
func testIntegration2() {
        let token = CancellationToken()
        
        self.testPromise(token: token)
            .then { (icons) in
                // on success
            }
            .catch { (error) in
                // on fail or cancel
            }
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            token.cancel() // simulate cancel
        }
    }
    
    func testPromise(token: CancellationToken? = nil) -> Promise<[Icon]> {
        return Promise<[Icon]>(on: .global(qos: .userInitiated)) {
            return self.loadHtml(token: token)
                .then({ (html) -> Promise<[URL]> in
                    return self.parseHtml(with: html)
                })
                .then({ (urls) -> Promise<[Icon]> in
                    return Promises.any([
                        self.faviconByUrl(urls: urls, token: token),
                        Promises.all([
                            self.faviconSmall(token: token),
                            self.faviconAppleTouch(token: token)
                        ])
                    ])
                    .then({ (result: [Maybe<[Icon]>]) -> Promise<[Icon]> in
                        fatalError() // do some transformations here ...
                    })
                })
            

        }
    }
    
    func loadHtml(token: CancellationToken? = nil) -> Promise<String> {
        fatalError()
    }
    
    func faviconAppleTouch(token: CancellationToken? = nil) -> Promise<Icon> {
        fatalError()
    }
    
    func faviconSmall(token: CancellationToken? = nil) -> Promise<Icon> {
        fatalError()
    }
    
    func faviconByUrl(urls: [URL], token: CancellationToken? = nil) -> Promise<[Icon]> {
        return Promises.all(urls.map { self.download(url: $0) })
    }
    
    func parseHtml(with: String) -> Promise<[URL]> {
        fatalError()
    }
    
    func download(url: URL, token: CancellationToken? = nil) -> Promise<Icon> {
        return Promise {
            let request = URLRequest(url: url)
            let task = URLSession(configuration: .ephemeral).dataTask(with: request) { data, response, error in
                // fulfill or resolve
            }
            
            try token?.onCancel {
                task.cancel()
            }
            
            task.resume()
        }
    }

from promises.

shoumikhin avatar shoumikhin commented on April 27, 2024

Hi @umbri, did you see this example? Does it look like something you may find useful?

from promises.

 avatar commented on April 27, 2024

Hi @umbri, thank you for the discussion. Please reopen if you have any additional comments or questions.

from promises.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.