我正在查看 Reason 的示例 A First Reason React app for Javascript developers
我看到他在使用 bs-fetch
时调用 Js.Promise.resolve
:
RepoData.fetchRepos()
|> Js.Promise.then_(repoData => {
handleReposLoaded(repoData);
Js.Promise.resolve();
})
|> ignore;
我也在 BuckleScript 代码中看到了类似的代码。例如Bucklescript Cookbook :
Js.Promise.(
Fetch.fetch "https://api.github.com/users/reasonml-community/repos"
|> then_ Fetch.Response.text
|> then_ (fun text ->
text
|> names
|> Array.iter Js.log
|> resolve)
|> ignore
在 JS 中,我们通常在创建新的 Promise 时调用 resolve
,而不是在使用返回 Promise 的函数时调用。那么为什么在上述情况下我们需要调用 resolve
呢?
最佳答案
Js.Promise.then_
要求返回一个新的 Promise。
原因是 es6 Promise 的类型不正确。 then 回调中返回的值会被动态包装或(无限)展平,以便它始终返回一个 Promise,而不是嵌套的 Promise。这意味着如果我们允许返回任何值 (let then_: ((_ => 'a), Js.Promise.t(_)) => Js.Promise.t('a)
),如果该值是一个 Promise ('a
= Js.Promise.t('b)
),则它将具有返回类型 Js.Promise .t(Js.Promise.t('b))
,但返回的值实际上已被展平为 Js.Promise.t('b)
。
让 then_
只接受回调中的一个 Promise,可以让您返回一个嵌套 Promise 变得更加明显,从而缓解这种情况。然而,仍然有可能解决
一个 promise ,因此该类型仍然不健全,但这使得搬起石头砸自己的脚变得有点困难。
在(可能不久的)将来将会有一个健全而优雅的 Promise API,但由于设计和实现它是一项艰巨的任务,因此需要一些时间才能做好。
关于promise - 为什么需要调用resolve()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446378/