Я пытаюсь освоить использование Iteratees в Play 2 для потоковой передачи результатов кометы. У меня есть дескриптор создания перечислителя из обратного вызова и перечислителя из карты. Моя проблема связана с Enumeratee.map, она принимает функцию, которая принимает чистый ввод и возвращает чистый вывод (например, преобразование String в Int в doc). Что я хотел бы сделать, так это взять чистый ввод и вернуть обещание результата. В конце концов, перечислитель передает перечислителю обещания, перечислитель преобразует один перечислитель в другой, поэтому должен быть способ сделать перечислитель, который сопоставляется с обещаниями.
Теперь позвольте мне привести пример, чтобы сделать это немного яснее. Допустим, у меня есть HTTP-запрос со списком идентификаторов для запроса в моей базе данных. Предположим, что эти идентификаторы представляют строки в таблице базы данных, и запрос выполняет набор (длинных) вычислений для этих строк, а затем возвращает набор объектов json, представляющих вычисление. Поскольку у меня есть долгая блокировка, было бы здорово передавать этот идентификатор по одному за раз, поэтому я хотел бы иметь перечисляемый конвейер, который делает:
- запрашивать строку в базе данных (возвращает обещание строки)
- сделать длинное вычисление в строке (берет строку и возвращает обещание вычисления)
- конвертировать длинные вычисления в JSON
- &> это в перечисление Comet, предоставленное Play 2
1 довольно просто, я могу создать перечислитель с fromCallback, который вернет обещание результата запроса. 3 также довольно прост, так как это простой Enumeratee.map
Но я не могу понять, как реализовать applyOn перечислителя на шаге 2. Я могу понять, что у меня есть бо создать новый итератор, который получает обещание от «внутреннего» итератора, flatMap длинный расчет и возврат новое обещание. Чего я не понимаю, так это того, как это сделать, учитывая странную подпись applyOn: def applyOn[A](it: Iteratee[To, A]): Iteratee[From, Iteratee[To, A]]
Может ли кто-нибудь помочь мне с этим?
Спасибо