Я думаю, что вы неправильно возвращаете ответ json. Это должно быть так:
var self = this;
fetch('https://randomuser.me/api/?results=50', {
responseType: 'json',
})
.then((response) => response.json())
.then((json) => {
console.log(json.data)
self.setState({pictures : json.data },()=>{
console.log(self.state.pictures)
})
});
type
является ключевым словом (псевдоним типа) и не должно использоваться в качестве имени переменной onComplete()
для Future
ожидания результата. Для этого мы можем определить заполнитель в getFoos()
- var fs: Seq[Foo] = Nil
. В будущее мы добавляем onComplete(tfr => fs = tfr.get.foos)
, а затем ждем некоторое время: Await.result(f, Duration(5000, "millis"))
(до 5 с в этом примере). Наконец, мы можем вернуть то, что находится в нашем заполнителе. Это должно сделать работу:
def getFoos(): Seq[Foo] = {
var fs: Seq[Foo] = Nil
val req = HttpRequest(method = HttpMethods.GET)
.withUri(Uri("/api/foo")).withHeaders(headers.Accept(MediaRange(MediaTypes.`application/json`)))
val f = Source
.single(req)
.via(flow)
.map(response => Unmarshal(response.entity).to[FooResponse])
f.onComplete(tfr => fs = tfr.get.foos)
Await.result(f, Duration(5000, "millis"))
fs
}
Я рекомендую изменить тип возвращаемого значения getFoos
с Seq[Foo]
на Future[Seq[Foo]]
, чтобы оставаться в контексте Future
:
def getFoos(): Future[Seq[Foo]] = {
val req =
HttpRequest(method = HttpMethods.GET)
.withUri(Uri("/api/foo"))
.withHeaders(headers.Accept(MediaRange(MediaTypes.`application/json`)))
Source
.single(req)
.via(flow)
.map(response => Unmarshal(response.entity).to[FooResponse])
.mapAsync(parallelism = 1)(fooResponse => fooResponse.map(_.foos))
.runWith(Sink.head)
}
Также, поскольку type
является зарезервированным ключевым словом в Scala, его нужно заключить в обратные кавычки в классе case Foo
:
case class Foo(id: String, `type`: String, color: String)