比如我有三个函数, 我开始是想要顺序 a
, F
, b
:
x = function
a()
F()
b()
end
但是后来出现需求, F
是一个异步的函数, 但为了方便, 我不打算改 x
的定义.
就是说, 我希望 F()
仍然保持这样的写法, 但是会处理到 F
当中的异步调用..
首先, 这在很多语言里是做不到的...
所以不限制编程语言的话, 是否有方案做到?
比如我有三个函数, 我开始是想要顺序 a
, F
, b
:
x = function
a()
F()
b()
end
但是后来出现需求, F
是一个异步的函数, 但为了方便, 我不打算改 x
的定义.
就是说, 我希望 F()
仍然保持这样的写法, 但是会处理到 F
当中的异步调用..
首先, 这在很多语言里是做不到的...
所以不限制编程语言的话, 是否有方案做到?
将实际上为异步的操作以同步的方式写出来,以下语言支持:
tornado.gen
有几种实现的js的话看老赵的Wind.js,Python的话使用yield可以达到可以参考Tornado的gen模块,有个文档说的不错http://www.dabeaz.com/coroutines/index.html ,C#的话新版本的有个await关键字别的语言就不知道了
package main
import "fmt"
func a() {
fmt.Println("func a()")
}
func b() {
fmt.Println("func b()")
}
func main() {
a()
ch := make(chan int)
go func() {
fmt.Println("func f do something")
<-ch
}()
b()
ch <- 1
fmt.Println("DONE")
}
JS的话Promise机制可以处理这个情况
改造后无论a/F/b都可以是异步/同步过程,无需改动x,同步过程返回结果,异步过程返回
thenable
对象即可这正是我之前在博客里评论回复的Promise的重要优点第三项 统一异步和同步过程的调用