Go 如何实现 Promise 模式 ?

44 阅读1分钟

场景

使用 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
}

参考文章

time.geekbang.org/column/arti…