在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
,但不会更改错误。
我过去使用过类似的构造,无法理解为什么这个构造无法正常工作。
答案 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
}
}
}
此代码可能需要一些修复(正如我上面说过的,我从未使用过蒸气),但是希望该代码可以对您有所帮助。