PureScript - 将 `launchAff_` 替换为 `launchAff`
PureScript - Replace `launchAff_` with `launchAff`
考虑以下工作代码示例,它使用 launchAff_
复制 JSON 文件:
module Main where
import Prelude
import Effect (Effect)
import Effect.Aff (Aff, launchAff_)
import Node.Encoding (Encoding(..))
import Node.FS.Aff (readTextFile, writeTextFile)
import Node.Path (FilePath)
duplicateCustomerData :: FilePath -> FilePath -> Aff Unit
duplicateCustomerData filePath1 filePath2 = do
customer_data <- readTextFile UTF8 filePath1
writeTextFile UTF8 filePath2 customer_data
main :: Effect Unit
main = launchAff_ do
duplicateCustomerData "database/customer-1.json" "database/customer-2.json"
但是,如果将 main 函数更改为使用 launchAff
(没有下划线),就像这样
main :: Effect Unit
main = launchAff do
duplicateCustomerData "database/customer-1.json" "database/customer-2.json"
抛出以下错误:
Could not match type
Fiber Unit
with type
Unit
因此,
- 什么是
fiber unit
?
- 这个
fiber unit
的用例是什么?它意味着被丢弃吗?它代表什么?
- 为什么有两个 launchAff 函数?
Fiber
表示一个运行异步计算。
Fiber
和Aff
的区别在于“运行”部分。 Aff
不是 运行 的异步计算,而是一种启动异步计算的方法。在您将其绑定到更大的计算中之前,它不会启动。相反,您可以多次启动相同的 Aff
。
另一方面,Fiber
是一个已经开始的异步计算,它已经在进行中。你可以通过 killFiber
or you can wait for it to complete via joinFiber
, and some other things. See the docs.
杀死它
现在我们知道 (1) Aff
是一种启动异步计算的方式,(2) Fiber
是一种 already-running 异步计算,它应该成为显然 Fiber
将是开始 Aff
的 结果 。这正是您所观察到的:launchAff
需要一个 Aff
并且 returns 需要一个 Fiber
.
但有时(根据我自己的经验 - 大多数时候)我们实际上并不需要结果 Fiber
。我们不会用它做任何事。对于这些情况,有一个方便的快捷方式 - launchAff_
。它与 launchAff
做同样的事情,但丢弃了结果 Fiber
。自己看看 in the source code.
在末尾添加下划线表示“returns unit”是一种常见的模式。比如有for
and for_
, there are traverse
and traverse_
, there are runAff
and runAff_
.
考虑以下工作代码示例,它使用 launchAff_
复制 JSON 文件:
module Main where
import Prelude
import Effect (Effect)
import Effect.Aff (Aff, launchAff_)
import Node.Encoding (Encoding(..))
import Node.FS.Aff (readTextFile, writeTextFile)
import Node.Path (FilePath)
duplicateCustomerData :: FilePath -> FilePath -> Aff Unit
duplicateCustomerData filePath1 filePath2 = do
customer_data <- readTextFile UTF8 filePath1
writeTextFile UTF8 filePath2 customer_data
main :: Effect Unit
main = launchAff_ do
duplicateCustomerData "database/customer-1.json" "database/customer-2.json"
但是,如果将 main 函数更改为使用 launchAff
(没有下划线),就像这样
main :: Effect Unit
main = launchAff do
duplicateCustomerData "database/customer-1.json" "database/customer-2.json"
抛出以下错误:
Could not match type
Fiber Unit
with type
Unit
因此,
- 什么是
fiber unit
? - 这个
fiber unit
的用例是什么?它意味着被丢弃吗?它代表什么? - 为什么有两个 launchAff 函数?
Fiber
表示一个运行异步计算。
Fiber
和Aff
的区别在于“运行”部分。 Aff
不是 运行 的异步计算,而是一种启动异步计算的方法。在您将其绑定到更大的计算中之前,它不会启动。相反,您可以多次启动相同的 Aff
。
Fiber
是一个已经开始的异步计算,它已经在进行中。你可以通过 killFiber
or you can wait for it to complete via joinFiber
, and some other things. See the docs.
现在我们知道 (1) Aff
是一种启动异步计算的方式,(2) Fiber
是一种 already-running 异步计算,它应该成为显然 Fiber
将是开始 Aff
的 结果 。这正是您所观察到的:launchAff
需要一个 Aff
并且 returns 需要一个 Fiber
.
但有时(根据我自己的经验 - 大多数时候)我们实际上并不需要结果 Fiber
。我们不会用它做任何事。对于这些情况,有一个方便的快捷方式 - launchAff_
。它与 launchAff
做同样的事情,但丢弃了结果 Fiber
。自己看看 in the source code.
在末尾添加下划线表示“returns unit”是一种常见的模式。比如有for
and for_
, there are traverse
and traverse_
, there are runAff
and runAff_
.