Как обработать результат списка будущего с помощью ReasonML?

Я пытаюсь просмотреть список элементов, кэшировать URL-адрес, а затем обновить URL-адрес в списке перед его рисованием.

Однако, похоже, я не могу этого сделать.

Любая идея?

external cache: option(string) => Js.Promise.t({. "uri": string, "filePath": string }) = "get";

let items = result##data##data->Option.getWithDefault([||]);
let cachedUri = items
   ->Belt.Array.map(
         item =>
           cache(item##hosted_video_url)
           ->FutureJs.fromPromise(Js.String.make)
           ->Future.flatMapOk(cachedObj => (
             {. "hosted_video_url": cachedObj##uri }
           )
   ))
   ->Belt.Array.toList
   ->Future.all;

person Natim    schedule 30.09.2019    source источник
comment
Откуда взялись Future и FutureJs? Они не поставляются с BuckleScript прямо из коробки. В любом случае суть фьючерсов и обещаний в том, что они представляют будущие ценности. Вы не можете просто вынуть его, так как его еще нет. Вы должны дождаться этого, что означает продолжение вычислений в контексте будущего. Там может быть функция Future.all, которая позволяет вам удобно ждать всех фьючерсов в списке, иначе работать со списком фьючерсов будет непросто.   -  person glennsl    schedule 30.09.2019
comment
Они поступают с сайта npmjs.com/package/reason-future.   -  person Natim    schedule 30.09.2019
comment
У этого действительно есть all функция, так что вы можете просто использовать это тогда.   -  person glennsl    schedule 30.09.2019


Ответы (1)


Идея состоит в том, что вы не можете выйти из будущего, поэтому вам нужно обновить состояние внутри будущего объекта, а не пытаться получить эквивалент asyncio.gather или что-то подобное.

Я изменился:

setVerticalData(_ => {items-> Js.Array2.sortInPlaceWith((a, b) => {...})});

с участием

items
  ->List.fromArray;
  ->List.map(item =>
      cache(item##hosted_video_url)
        ->FutureJs.fromPromise(Js.String.make)
   )
   ->Future.all
   ->Future.map(cachedList => {
        setVerticalData(_ => {items: cachedList})
   })

person Natim    schedule 30.09.2019