场景
使用 Go 参考 JavaScript 的 Promise 模式实现异步编程的错误处理。(异步 goroutine 的错误通过 channel 接收也可以,不一定需要用 Promise 来实现)
分析
- Promise 类初始化需要注册一个函数异步执行
- 当注册函数执行完需要根据执行成功或者失败调用 successHandler 或者 errorHandler
代码
type Promise struct {
wg sync.WaitGroup
err error //
res string
}
func NewPromise(do func() (string, error)) *Promise {
p := &Promise{}
p.wg.Add(1)
go func() {
p.res, p.err = do()
p.wg.Done()
}()
return p
}
func (p *Promise) Then(successHandler func(res string), errorHandler func(err error)) *Promise {
go func() {
p.wg.Wait() // 等待 do 执行完,根据 p.err 决定执行哪个 handler
if p.err != nil {
errorHandler(p.err)
return
}
successHandler(p.res)
}()
return p
}
func main() {
done := make(chan struct{})
p := NewPromise(do)
p.Then(func(res string) {
fmt.Println("success :", res)
close(done)
}, func(err error) {
fmt.Println("err :", err)
close(done)
})
<-done
}