1

我有 3 个承诺,每个承诺单独工作:

DataManager.reverseGeoCodePromise("42.527328", longitude: "-83.146928").then { data in
    print("Zip \(data)")
}

DataManager.getEnviroUVWithZipPromise("48073").then { data in
    print("UV \(data.getUVIndex())")
}

DataManager.getCurrentForZipPromise("48073").then { data in
    print("AirNow \(data[0].Latitude)")
}

我一直在尝试关注 promisekit 3 上的 (sparce) swift 文档(以及用尽的谷歌和堆栈溢出)。我链接这些异步方法的尝试根本不是同步执行的——所有的 print(data) 都是空的,但是方法中的断点显示了数据。

DataManager.reverseGeoCodePromise("42.527328", longitude: "-83.146928").then { data in
    print("Promise Zip \(data)")
}.then { data -> Void in
    DataManager.getEnviroUVWithZipPromise("48073")
    print("Promise Enviro \(data)")
}.then { data -> Void in
    DataManager.getCurrentForZipPromise("48073")
    print("Promise AirNow \(data)")
}.error { error in
    print("Promise doh!")
}

我希望将第一次调用 (zip) 中的数据传递给后续调用,并能够处理最后一次调用之后的所有调用中的数据。任何见解都非常感谢!

4

1 回答 1

0

您的问题是您的闭包正在返回Void而不是Promise<T>. 该then块不希望返回任何内容,因此它会继续进行而不等待承诺被履行或拒绝。

这是一个完整的例子。您可以将其粘贴到 PromiseKit 游乐场进行测试。

var zipcode: String?

UIApplication.sharedApplication().networkActivityIndicatorVisible = true

firstly {

    return DataManager.reverseGeoCodePromise("42.527328", longitude: "-83.146928")

}.then { (data: String) -> Promise<String> in
    // ^ I expect to receive a string. I promise to return a string        

    zipcode = data
    // ^ Store zip code so it can be used further down the chain

    print("Returned from reverseGeoCodePromise: \(data)")
    return DataManager.getEnviroUVWithZipPromise(zipcode!)

}.then { (data: String) -> Promise<String> in
    // ^ I expect to receive a string. I promise to return a string

    print("Returned from getEnviroUVWithZipPromise: \(data)")
    return DataManager.getCurrentForZipPromise(zipcode!)

}.then { (data: String) -> Void in
    // ^ I expect to receive a string. I return nothing

    print("Returned from getCurrentForZipPromise: \(data)")

}.always {

    UIApplication.sharedApplication().networkActivityIndicatorVisible = false

}.error { error in

    switch error {
    case DataManagerError.FailedDueToX:
        print("got an error")
    default:
        print("unknown error")
    }

}

示例自定义错误类型:

enum DataManagerError: ErrorType {
    case FailedDueToX
}

示例数据管理器承诺:

class DataManager {
    static func reverseGeoCodePromise(lat: String, longitude: String) -> Promise<String> {
        return Promise { fulfill, reject in
            if 1 == 1 {
                fulfill("48073")
            } else {
                reject(DataManagerError.FailedDueToX)
            }
        }
    }

    static func getEnviroUVWithZipPromise(zip: String) -> Promise<String> {
        return Promise { fulfill, reject in
            if 1 == 1 {
                fulfill("Two")
            } else {
                reject(DataManagerError.FailedDueToX)
            }
        }
    }

    static func getCurrentForZipPromise(zip: String) -> Promise<String> {
        return Promise { fulfill, reject in
            if 1 == 1 {
                fulfill("Three")
            } else {
                reject(DataManagerError.FailedDueToX)
            }
        }
    }

}
于 2016-01-25T16:31:03.333 回答