promise - 为什么需要调用resolve()?

标签 promise reason bucklescript

我正在查看 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/

相关文章:

reason - 编译 Reason 源文件到与源文件相同的目录

javascript - 不能将原型(prototype)函数放入promise解析中吗?

javascript - 如何将所有这些逻辑与 javascript Promises 混合在一起?

ocaml - 带有可选和可变字段的记录

reason - Reason 中的 .() 和 .{} 有什么区别?

ocaml - 为具有泛型类型参数的多态变体编写类型约束

javascript - ValidateJS 异步 REST 调用

javascript - 我怎样才能摆脱这个 Promise for 循环?

node.js - 获取 Node.js 中生成子进程的结果

html5-canvas - 使用 React Hooks 从 ReasonML 使用 HTML Canvas