1

我应该如何在 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 行收到错误“无法将 'URLDataPromise' 类型的值转换为闭包结果类型 'AnyPromise'”。

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

4

2 回答 2

8

我想到了。问题只是 NSURLSession.GET 不返回 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");
}
于 2015-12-09T17:27:38.460 回答
1

首先,我没有看到可以从中返回字典的接口NSURLSession.GET,所以我使用的是NSData. 此外,您必须在每个闭包中返回 promisethen以便将它们链接在一起:

firstly {
    NSURLSession.GET(url)
}.then { (data) -> AnyPromise in
    return AnyPromise(bound: NSURLSession.GET(url2))
}.then { (secondData) in
    print("End of second request")
}
于 2015-12-09T15:36:13.783 回答