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

时间:2018-10-06 22:51:47

标签: swift vapor

在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调用中,在request的末尾显示了编译器错误asyncExecute。我尝试将flatMap替换为transform,但不会更改错误。

我过去使用过类似的构造,无法理解为什么这个构造无法正常工作。

1 个答案:

答案 0 :(得分:2)

我还从未使用过蒸气,但是就我检查了您的代码并观看了一些文档和蒸气的源代码而言,您的代码将永远不会被编译。

  • 您需要将第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
        }
    }
}

此代码可能需要一些修复(正如我上面说过的,我从未使用过蒸气),但是希望该代码可以对您有所帮助。