首页 > 解决方案 > 调用中缺少参数 #4 的参数会忽略闭包

问题描述

在 Vapor 3 中,在同步函数中这有效:

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

但是,如果我尝试在以下路线中使用期货和闭包:

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 行的调用Missing argument for parameter #4 in call末尾显示了一个编译器错误。我试过用替换,但它不会改变错误。requestasyncExecuteflatMaptransform

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

标签: swiftvapor

解决方案


我还没有使用过 vapor,但就我查看一些文档和 vapor 的源代码检查你的代码而言,你的代码永远不会被编译。

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

    它不是可选的。

  • 传递给第四个参数的闭包必须是 type (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
        }
    }
}

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


推荐阅读