swift - 调用中缺少参数 #4 的参数会忽略闭包

标签 swift vapor

在 Vapor 3 中,在一个同步函数中,这是可行的:

return try Process.execute( "/usr/local/bin/demo", [ "p1", "p2" ] )

但是,如果我尝试在以下 route 使用 Futures 和闭包:

router.get("async") { request -> Future<String> in
    return Process.asyncExecute( "/usr/local/bin/demo", [ "p1", "p2" ], on:request ).flatMap(to:String) { output in
            switch output {
                case .stdout(let data): return(String(data: data, encoding: .utf8) ?? "")
                case .stderr(let data): return(String(data: data, encoding: .utf8) ?? "")
            }
    }
}

我在第 2 行的 asyncExecute 调用的 request 末尾收到编译器错误 Missing argument for parameter #4 in call上面的代码。我尝试用 transform 替换 flatMap 但它并没有改变错误。

我过去使用过类似的结构,但不明白为什么这个结构不起作用。

最佳答案

我从未使用过 vapor,但据我检查您的代码并查看一些文档和 vapor 的源代码,您的代码永远不会被编译。

  • 您需要将第 4 个参数传递给 asyncExecute(_:_:on:_:) .

    它不是可选的。

  • 传递给第四个参数的闭包必须是 (ProcessOutput) -> () 类型.

    闭包不能返回值。

  • asyncExecute(_:_:on:_:)的结果类型是Future<Int32> .

    如果你想申请 flatMap(to:_:) , 传递给第二个参数的闭包需要是 (Int32) throws -> Future<T> 类型.

我猜你想写这样的东西:

router.get("async") { request -> Future<String> in
    var sout: String = ""
    var serr: String = ""
    return Process.asyncExecute( "/usr/local/bin/demo", [ "p1", "p2" ], on: request ) { output in
        switch output {
        case .stdout(let data):
            sout = String(data: data, encoding: .utf8) ?? ""
        case .stderr(let data):
            serr = String(data: data, encoding: .utf8) ?? ""
        }
    }.map(to: String.self) {retVal in
        if retVal == 0 {
            return sout
        } else {
            return serr
        }
    }
}

此代码可能需要一些修复(正如我上面所说,我从未使用过 vapor),但我希望这段代码可以帮助您解决问题。

关于swift - 调用中缺少参数 #4 的参数会忽略闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684010/

相关文章:

ios - 通过 Swift 中一个键的多个值过滤 Firebase 结果

swift - 从 Vapor 3 中的作业访问服务

swift - 为什么 Xcode 一直用 '_' 替换泛型

swift - Steam 3 : Eventloop bug detected when using wait()

ios - 在 Swift 3.0 中访问从 iTunes API 解析的 JSON 对象

ios - 覆盖 TabBarController 中 ViewController 的类型?

ios - Swift HTTP 发布请求无法工作

ios - Tableview 没有获取 Xib 文件高度

swift - Vapor HTTPClient 跟随重定向

swift - 返回重定向响应而不是预期的叶 View