deville deville - 6 months ago 18
Swift Question

PromiseKit with Swift: terminate chain of promises

I'm trying to use PromiseKit with Swift. I am not really familiar with it, and there doesn't seem to be much information on its usage with Swift.

I can't seem to figure out how to terminate a chain of promises. As long as the last (terminal)

then
block contains a single statement, everything is fine:

firstly {
// ...
}.then { obj in
self.handleResult(obj)
}.catch { error in
self.handleError(error)
}


However, if I try to add another statement, compiler complains:

firstly {
// ...
}.then { obj in
self.handleResult(obj)
self.doSomethingDifferent(obj)
}.catch { error in // compiler error: Missing return in a closure expected to return 'AnyPromise'
self.handleError(error)
}


Obviously, the solution is to return another promise, but it doesn't make sense in the terminal block. Is there anything else I can do?

Answer

According to http://promisekit.org/PromiseKit-2.0-Released/, under Swift Compiler Issues section:

The Swift compiler will often error with then. To figure out the issue, first try specifying the full signature for your closures:

foo.then { x in
    doh()
    return bar()
}

// will need to be written as:

foo.then { obj -> Promise<Type> in
    doh()
    return bar()
}

// Because the Swift compiler cannot infer closure types very
// well yet. We hope this will be fixed.

// Watch out for  one-line closures though! Swift will
// automatically infer the types, which may confuse you:

foo.then {
    return bar()
}

So you'll have to change your code to:

firstly {
    // ...
}.then { obj -> Promise<WhateverTypeDoSomethingDifferentPromises> in
    self.handleResult(obj)
    self.doSomethingDifferent(obj)
}.catch { error in
    self.handleError(error)
}

Or you can use obj -> Void to stop the chain