PromiseKit首先围绕代码,而不是函数调用

时间:2018-09-20 07:09:54

标签: swift promisekit

我不想编写单独的函数来在我的第一个调用中返回Promise。我只想写这个:

firstly
{
    return Promise<Bool>
    { inSeal in
        var isOrderHistory = false
        let importTester = CSVImporter<String>(url: url)
        importTester?.startImportingRecords(structure:
            { (inFieldNames) in
                if inFieldNames[2] == "Payment Instrument Type"
                {
                    isOrderHistory = true
                }
            }, recordMapper: { (inRecords) -> String in
                return ""   //  Don't care
            }).onFinish
            { (inItems) in
                inSeal.resolve(isOrderHistory)
            }
    }
}
.then
{ inIsOrderHistory in
    if inIsOrderHistory -> Void
    {
    }
    else
    {
...

但是我出了点问题。 ImportMainWindowController.swift:51:5: Ambiguous reference to member 'firstly(execute:)'

示例代码或文档似乎都没有涵盖这个(我认为是)基本用例。在上面的代码中,CSVImporter在后台队列上运行,并异步(尽管按顺序)调用方法。

我不知道Promisefirstly的完整类型规范应该是什么,或者是什么。

1 个答案:

答案 0 :(得分:2)

根据我的理解,由于您在诺言链中使用then,所以它也意味着要返回诺言,因此会出现此错误。如果您不打算从下一步退还承诺,则可以先使用done

如果要从then返回Promise,请使用下面的链条

firstly {
     Promise<Bool> { seal in
        print("hello")
        seal.fulfill(true)
     }
}.then { (response) in
    Promise<Bool> { seal in
            print(response)
            seal.fulfill(true)
    }
}.done { _ in
    print("done")
}.catch { (error) in
        print(error)
}

如果您不想从then返回Promise,则可以使用如下所示的链。

firstly {
            Promise<Bool> { seal in
                print("hello")
                seal.fulfill(true)
            }
        }.done { _ in
                print("done")
        }.catch { (error) in
                print(error)
        }

我希望它能帮上忙。

已更新:

如果您不想返回任何内容,并且then要求返回Promise,则可以像下面这样返回Promise<Void>

firstly {
    Promise<Bool> { seal in
        print("hello")
        seal.fulfill(true)
    }
}.then { (response) -> Promise<Void> in
            print(response)
            return Promise()
}.done { _ in
        print("done")
}.catch { (error) in
        print(error)
}