promises


Node.js

  1. function asyncMethod(value) {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. resolve('resolved: ' + value)
  5. }, 1e3)
  6. })
  7. }
  8. function main() {
  9. asyncMethod('foo')
  10. .then(result => console.log(result))
  11. .catch(err => console.error(err))
  12. Promise.all([
  13. asyncMethod('A'),
  14. asyncMethod('B'),
  15. asyncMethod('C')
  16. ])
  17. .then(result => console.log(result))
  18. .catch(err => console.error(err))
  19. }
  20. main()

Output

  1. resolved: foo
  2. [ 'resolved: A', 'resolved: B', 'resolved: C' ]

Go

(closest thing is to use channels)

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. "github.com/prometheus/common/log"
  7. )
  8. func asyncMethod(value string) chan interface{} {
  9. ch := make(chan interface{}, 1)
  10. go func() {
  11. time.Sleep(1 * time.Second)
  12. ch <- "resolved: " + value
  13. close(ch)
  14. }()
  15. return ch
  16. }
  17. func resolveAll(ch ...chan interface{}) chan interface{} {
  18. var wg sync.WaitGroup
  19. res := make([]string, len(ch))
  20. resCh := make(chan interface{}, 1)
  21. go func() {
  22. for i, c := range ch {
  23. wg.Add(1)
  24. go func(j int, ifcCh chan interface{}) {
  25. ifc := <-ifcCh
  26. switch v := ifc.(type) {
  27. case error:
  28. resCh <- v
  29. case string:
  30. res[j] = v
  31. }
  32. wg.Done()
  33. }(i, c)
  34. }
  35. wg.Wait()
  36. resCh <- res
  37. close(resCh)
  38. }()
  39. return resCh
  40. }
  41. func main() {
  42. var wg sync.WaitGroup
  43. wg.Add(2)
  44. go func() {
  45. result := <-asyncMethod("foo")
  46. switch v := result.(type) {
  47. case string:
  48. fmt.Println(v)
  49. case error:
  50. log.Errorln(v)
  51. }
  52. wg.Done()
  53. }()
  54. go func() {
  55. result := <-resolveAll(
  56. asyncMethod("A"),
  57. asyncMethod("B"),
  58. asyncMethod("C"),
  59. )
  60. switch v := result.(type) {
  61. case []string:
  62. fmt.Println(v)
  63. case error:
  64. log.Errorln(v)
  65. }
  66. wg.Done()
  67. }()
  68. wg.Wait()
  69. }

Output

  1. resolved: foo
  2. [resolved: A resolved: B resolved: C]