swift - 调用中缺少参数 #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
末尾显示了一个编译器错误。我试过用替换,但它不会改变错误。request
asyncExecute
flatMap
transform
我过去使用过类似的结构,但不明白为什么这个不工作。
解决方案
我还没有使用过 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
}
}
}
这段代码可能需要一些修复(正如我上面所说的,我从未使用过蒸汽),但我希望这段代码可以帮助你解决你的问题。
推荐阅读
- sql - 我可以准确查询结果吗
- java - 对整数输入进行排序时如何在输出中显示“主题”
- python - Python,日期时间对象
- python - 查找按钮重定向到的链接
- ssl - 支持 TLS 的通配符域:GKE 上的 Kubernetes Ingress
- javascript - 不理解 JavaScript 中的 2D 矩阵算法问题
- java - 导航 ArrayList
- machine-learning - python中添加输出层的难点
- ffmpeg - 使用 FFmpeg 将带有 A/52 B 音频(又名 E-AC3)的 MKV 转换为 AAC 的问题
- django - 如何在 django 模型中将旧图像替换为另一个新图像?