为什么需要调用resolve()?

599*_*644 3 promise reason bucklescript

我正在为Javascript开发人员查看 Reason的第一个原因反应应用程序的示例

我看到他Js.Promise.resolve在使用时正在打电话bs-fetch:

RepoData.fetchRepos()
  |> Js.Promise.then_(repoData => {
       handleReposLoaded(repoData);
       Js.Promise.resolve();
     })
  |> ignore;
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

在JS中,我们通常resolve在创建新promise时调用,而不是在使用返回promise的函数时调用.那么为什么我们需要打电话给resolve上面的案例呢?

gle*_*nsl 6

Js.Promise.then_ 要求返回新的承诺.

原因是es6承诺没有合理的类型.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)),但返回的值实际上将被展平为a Js.Promise.t('b).

then_只接受回调承诺解决了这个受了一点使它更加明显,你返回一个嵌套的承诺.resolve然而,它仍有可能成为一个承诺,所以类型仍然不健全,但它让你在脚下射击更加困难.

在(可能接近)未来将会有一个声音和优雅的承诺API,但由于设计和实现它是一项非常重要的任务,因此需要花费一些时间才能做到正确.