package main
import (
"fmt"
"time"
)
type Promise struct {
result chan interface{}
error error
}
func NewPromise(task func() interface{}) *Promise {
p := &Promise{result: make(chan interface{}, 1)}
go func() {
result := task()
p.result <- result
}()
return p
}
func (p *Promise) Then(callback func(interface{}) interface{}) *Promise {
return NewPromise(func() interface{} {
result := <-p.result
if p.error != nil {
return p.error
}
return callback(result)
})
}
func (p *Promise) Catch(callback func(error) interface{}) *Promise {
return NewPromise(func() interface{} {
if p.error != nil {
return callback(p.error)
}
result := <-p.result
return result
})
}
func main() {
promise := NewPromise(func() interface{} {
return "Hello, World!"
})
promise.Then(func(result interface{}) interface{} {
message := result.(string)
fmt.Println(message)
return nil
}).Then(func(result interface{}) interface{} {
fmt.Println("Hello, Promise!")
return nil
}).Then(func(result interface{}) interface{} {
fmt.Println("Hello, Promise2!")
return nil
})
// 等待异步操作完成
time.Sleep(10 * time.Second)
}
go语言类似Promise操作
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- wslog原理 利用github.com上无数的slack hook 日志工具sdk 遵循 slack hook ...
- 在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周...
- response使用示例: 利用闭包延时求值 result 是一个闭包,只有这个闭包在执行的时候才会获取self....
- 导读:我们经常使用打车软件出行,也经常思考其架构设计。本文作者在所在国家也负责开发一款打车软件,并且开源了其中大部...