为什么需要调用 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,但由于设计和实施是一项艰巨的任务,因此需要一些时间才能正确完成.
我正在 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,但由于设计和实施是一项艰巨的任务,因此需要一些时间才能正确完成.