为什么需要调用 resolve()?

Why the need to call resolve()?

我正在 A First Reason React app for Javascript developers

查看 Reason 的示例

而且我看到他在使用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 中,我们通常在创建新承诺时调用 resolve,而不是在使用 returns 承诺的函数时调用。那么为什么我们需要在上述情况下调用resolve呢?

Js.Promise.then_ 需要 returned 新承诺。

原因是 es6 promise 的类型不正确。在 then 回调中编辑的值 return 被动态包装或(无限)扁平化,因此它始终 return 是一个承诺,而不是嵌套的承诺。这意味着如果我们允许任何值被 returned (let then_: ((_ => 'a), Js.Promise.t(_)) => Js.Promise.t('a)),并且如果该值是一个 promise ('a = Js.Promise.t('b)),它将具有 return 键入 Js.Promise.t(Js.Promise.t('b)),但值 returned 实际上会被压扁为 Js.Promise.t('b).

then_ 仅接受来自回调的承诺,通过使您 return 嵌套承诺变得更加明显,可以稍微缓解这种情况。然而,仍然可以 resolve 一个 promise,所以这种类型仍然不健全,但这让搬起石头砸自己的脚更难。

在(可能不久的将来)会有一个健全而优雅的承诺 API,但由于设计和实施是一项艰巨的任务,因此需要一些时间才能正确完成.