【发布时间】:2021-01-06 21:26:52
【问题描述】:
我有一个库使用reason-promise 作为默认分支而不是另一个分支的情况。我发现很难从一个分支切换到另一个分支,因为我一生都无法弄清楚如何使用reason-promise。我在 Js.Promise 方面并没有好多少,但这不是重点。
有问题的图书馆是reason-apollo-client。该分支还有许多其他改进,包括 reason-promise 作为默认的 promise 实现。该分支是next branch。
例如,在reason-promise-question 找到,我有一个Js.Promise 函数,它可以让我获得当前的令牌值。它有以下类型:
unit => Js.Promise.t(
Js.Nullable.t(string)
)
该功能可在Tokens 中找到,转载如下。这是一个哑函数,没有绑定。关键是看如何让它编译。
[@bs.val] [@bs.scope "localStorage"]
external setItem: (string, string) => unit = "setItem";
let setUserToken: string => Js.Promise.t(unit) =
token => Js.Promise.resolve(setItem("auth", token));
[@bs.val] [@bs.scope "localStorage"]
external getItem: string => Js.Nullable.t(string) = "getItem";
let getUserToken: unit => Js.Promise.t(Js.Nullable.t(string)) =
() => Js.Promise.resolve(getItem("auth"));
let setTempUserToken: string => Js.Promise.t(unit) =
_ => Js.Promise.resolve();
let getTempUserToken: unit => Js.Promise.t(Js.Nullable.t(string)) =
() => Js.Promise.resolve(Js.Nullable.undefined);
当我在创建apollo/client authlink 时尝试将其与reason-promise 一起使用时,出现以下错误:
unit => Js.Promise.t(
Js.Nullable.t(string)
)
Error: This expression has type
Js.Promise.t(Js.Json.t) = Js.Promise.t(Js.Json.t)
but an expression was expected of type
Promise.t(Js.Json.t) = Promise.rejectable(Js.Json.t, Promise.never)
这里是authlink 函数:
let authLink =
ApolloClient.Link.ContextLink.makeAsync((~operation as _, ~prevContext as ctx) => {
Tokens.getUserToken()
->Js.Promise.then_(
token => {
switch (token->Js.Nullable.toOption) {
| None =>
Tokens.getTempUserToken()
->Js.Promise.then_(
token => Js.Promise.resolve(Js.Nullable.toOption(token)),
_,
)
| Some(token) => Js.Promise.resolve(Some(token))
}
},
_,
)
->Js.Promise.then_(
fun
| None => Js.Promise.resolve(Js.Json.null)
| Some(token) => {
Js.Promise.resolve(
[%raw
{| (context, token) => ({
headers: {
...ctx.headers,
authorization: `Bearer ${token}`
}
}) |}
](
ctx,
token,
),
);
},
_,
)
});
我们如何将其转换为理性承诺?请随意随心所欲。
提前谢谢你。
【问题讨论】:
标签: promise apollo-client reason bucklescript