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上面的案例呢?
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,但由于设计和实现它是一项非常重要的任务,因此需要花费一些时间才能做到正确.
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |