Отсутствующий аргумент для параметра # 4 в вызове игнорирует закрытие - PullRequest
0 голосов
/ 07 октября 2018

В 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) ?? "")
            }
    }
}

, я получаюошибка компилятора Missing argument for parameter #4 in call, показанная в конце request в вызове asyncExecute во второй строке кода выше.Я попытался заменить flatMap на transform, но это не изменит ошибку.

Я использовал подобные конструкции в прошлом и не могу понять, почему эта не работает.

1 Ответ

0 голосов
/ 07 октября 2018

Я еще ни разу не использовал пар, но поскольку я проверял твой код, просматривая некоторые документы и исходный код пар, твой код никогда не скомпилируется.

  • Тебе нужнопередать 4-й параметр в asyncExecute(_:_:on:_:).

    Это НЕ опционально.

  • Закрытие, переданное 4-му аргументу, должно иметь тип(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
        }
    }
}

Этот код может нуждаться в некоторых исправлениях (как я уже говорил выше, я никогда не использовал пар), но я надеюсь, что этот код может помочь вам решить вашу проблему.

...