调用中缺少参数 #4 的参数会忽略闭包
Missing argument for parameter #4 in call ignores closure
在 Vapor 3 中,在同步函数中这有效:
return try Process.execute( "/usr/local/bin/demo", [ "p1", "p2" ] )
但是,如果我尝试在以下路线中使用 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) -> ()
.
类型
闭包不能return一个值。
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),但我希望此代码可以帮助您解决问题。
在 Vapor 3 中,在同步函数中这有效:
return try Process.execute( "/usr/local/bin/demo", [ "p1", "p2" ] )
但是,如果我尝试在以下路线中使用 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) -> ()
.闭包不能return一个值。
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),但我希望此代码可以帮助您解决问题。