Создайте родительский объект и дочерние элементы и перенаправьте запрос в свободном потоке - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь создать задачу Task и один дочерний объект, используя один и тот же объект запроса.

func create(_ req: Request) throws -> Future<Response> {
    return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
        let user = try req.requireAuthenticated(User.self)
        let task = Task(name: taskForm.name, userId: user.id!)
        return task.save(on: req).map { t in
            let interval = try Interval(taskId: t.requireID())
            let t = interval.save(on: req)
            return t.save(on: req).map { _ in
                return req.redirect(to: "/dashboard")
            }
        }
    }
}

Я получаю следующую ошибку:

Невозможно преобразовать возвращаемое выражениетипа 'EventLoopFuture' для возврата типа 'Response'.

Есть идеи о том, в чем проблема?

1 Ответ

1 голос
/ 24 сентября 2019

Этот код должен работать

func create(_ req: Request) throws -> Future<Response> {
    return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
        let user = try req.requireAuthenticated(User.self)
        let task = Task(name: taskForm.name, userId: user.id!)
        return task.create(on: req).flatMap { t in
            let interval = try Interval(taskId: t.requireID())
            return interval.create(on: req).flatMap { _ in
                return t.create(on: req).transform(to: req.redirect(to: "/dashboard"))
                // or your previous variant
//                return t.create(on: req).map { _ in
//                    return req.redirect(to: "/dashboard")
//                }
            }
        }
    }
}

Есть несколько вещей, которые вы можете выучить

  1. использовать map, когда вам нужно вернуть непредвиденный результат
  2. использовать flatMap вы должны вернуть Future<> результат
  3. использовать create вместо save при создании объекта в БД
  4. не оставляйте будущие вызовы безобрабатывать их, как вы делаете в строке # 7
...