PromiseKit 3.0链接

时间:2016-05-15 01:20:03

标签: swift promisekit

我试图编写一个返回promise的函数:

func sample() -> Promise<AnyObject> {
    return Promise(1)
    .then { _ -> Void in
        debugPrint("foo")
    }.then { _ -> Void in
        debugPrint("foo")
    }
}

我在最后一句话中收到错误:

Declared closure result 'Void' (aka '()') is incompatible with contextual type 'AnyPromise'

我的印象是&#39;然后&#39;无论如何应该隐含地回复承诺;我的想法错了吗?我应该像这样明确地返回一个承诺吗?:

func sample() -> Promise<AnyObject> {
    return Promise(1)
    .then { _ -> Void in
        debugPrint("foo")
    }.then { _ -> Promise<AnyObject> in
        debugPrint("foo")
        return Promise(1)
    }
}

由于

2 个答案:

答案 0 :(得分:3)

then(_:)返回的promise与闭包的返回值匹配。

func sample() -> Promise<AnyObject> {
    return Promise(1)
    .then { _ -> Void in
        debugPrint("foo")
    }.then { _ -> Void in
        debugPrint("foo")
    }
}

让我重新修改你的方法。

func sample() -> Promise<AnyObject> {
    let p1: Promise<AnyObject> = Promise(1)
    let p2: Promise<Void> = p1.then { _ -> Void in
        debugPrint("foo")
    }
    let p3: Promise<Void> = p2.then { _ -> Void in
        debugPrint("foo")
    }
    return p3
}

您现在可以看到Promise<AnyObject>的预期回复类型与Promise<Void>的实际回复类型不符。

如果您希望方法返回Promise<AnyObject>,则承诺链中的最后一个承诺必须返回AnyObject

func sample() -> Promise<AnyObject> {
    return firstly { _ -> Void in
        debugPrint("foo")
    }.then { _ -> Void in
        debugPrint("foo")
    }.then { _ -> AnyObject in
        1
    }
}

答案 1 :(得分:2)

then来电会在您的第一个示例中返回您在其通话中指定的内容,Void

对于您的第二次尝试,您已经离我更近了,但是您已经返回了一个不相关的Promise,您必须第二次与1一起完成。

请尝试使用此代码:

func sample() -> Promise<AnyObject> {
    return Promise<AnyObject> { fulfill, reject in
        return Promise<AnyObject>(1)
        .then { _ -> Void in
            debugPrint("foo")
        }.then { _ -> Void in
            debugPrint("foo")
        }
    }
}

这会将第二个Promise嵌入到第一个中,所以现在您的then将按顺序运行,以及您添加到函数返回的承诺时的任何其他getResourceAsStream()&# 39; s在你的代码中的其他地方调用。