在 PromiseKit 3.0 和 Swift 2 中链接承诺

Chaining promises in PromiseKit 3.0 And Swift 2

我应该如何在 PromiseKit 3.0 和 Swift 2 中链接承诺?我正在尝试以下代码:

let url = "https://httpbin/org/get";
let url2 = "https://httpbin/org/get";
firstly {
    NSURLSession.GET(url)
}.then { (json: NSDictionary) in
    NSURLSession.GET(url2) // Error in this line
}.then { (json: NSDictionary) in
    print("End of second request");
}

但是我在第 6 行收到错误 "Cannot convert value of type 'URLDataPromise' to closure result type 'AnyPromise'"。

这基本上是从 PromiseKit 网站上检索到的示例,它应该可以工作,不是吗?我做错了什么?

首先,我没有看到可以 return 来自 NSURLSession.GET 的字典的界面,所以我正在使用 NSData。此外,您必须 return 承诺每个 then 闭包才能将它们链接在一起:

firstly {
    NSURLSession.GET(url)
}.then { (data) -> AnyPromise in
    return AnyPromise(bound: NSURLSession.GET(url2))
}.then { (secondData) in
    print("End of second request")
}

我明白了。问题只是 NSURLSession.GET 没有 return NSDictionary 所以下面的代码足以解决问题:

let url = "https://httpbin/org/get";
let url = "https://httpbin/org/get";
let url2 = "https://httpbin/org/get";
firstly {
    NSURLSession.GET(url)
}.then { data in
    NSURLSession.GET(url2)
}.then { data in
    print("End of second request");
}

一件重要的事情是,如果您的闭包有多行代码,Swift 无法推断类型,如果是这种情况,您必须在闭包声明中指定类型。 这里有一些例子:

let url = "https://httpbin/org/get";
let url2 = "https://httpbin/org/get";
firstly {
    NSURLSession.GET(url)
}.then { data -> URLDataPromise in
    print("Two lines clojure with return");
    return NSURLSession.GET(url2)
}.then { data -> Void in
    print("Two lines clojure without return");
    print("Second line sample");
}