Используя реагировать родной асин c хранилище getItem - PullRequest
0 голосов
/ 28 марта 2020
  React.useEffect(_ => {
    ReactNativeAsyncStorage.getItem("jwt")
    |> Js.Promise.then_(jwt => {Js.log(jwt)});
    None;
  });

Ошибка:

This expression has type unit but an expression was expected of type
         Js.Promise.t('a) = Js.Promise.t('a)

Я использую https://github.com/reason-react-native/async-storage с https://github.com/react-native-community/async-storage

1 Ответ

1 голос
/ 28 марта 2020

Тип Js.Promise.then_ равен

('a => t('b), t('a)) => t('b)

, что означает, что переданная ему функция должна вернуть a, и что then_ само вернет это обещание.

Вы допустив две ошибки в вашем коде:

  1. Вы не возвращаете обещание от функции, которую вы передаете then_
  2. Вы не обрабатываете обещание, возвращенное then_.

Следующее исправляет оба:

  React.useEffect(_ => {
    let _: Js.Promise.t(unit) =
      Js.Prmoise.(
        ReactNativeAsyncStorage.getItem("jwt")
        |> then_(jwt => resolve(Js.log(jwt)))
      );
    None;
  });

let _: Js.Promise.t(unit) = ... использует шаблон подстановки, чтобы отбросить результат следующего выражения. Тип результата - Js.Result.t(unit), аннотированный для защиты от случайного частичного применения.

resolve(Js.log(jwt)) вернет обещание с результатом вызова Js.log, то есть unit, поэтому, почему результирующее обещание имеет тип Js.Promise.t(unit).

Подробнее о том, как использовать обещания, см. в документации Reason .

...