csjiabin's blog csjiabin's blog
首页
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
  • 学习笔记

    • 《面向Node.js开发者的Go》
更多
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

csjiabin

前端界的小菜鸟
首页
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
  • 学习笔记

    • 《面向Node.js开发者的Go》
更多
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • comments
  • printing
  • logging
  • variables
  • interpolation
  • types
  • type check
  • if/else
  • for
  • while
  • switch
  • arrays
  • uint8 arrays
  • array iteration
  • array sorting
  • buffers
  • maps
  • objects
  • functions
  • default values
  • destructuring
  • spread operator
  • rest operator
  • swapping
  • classes
  • generators
  • datetime
  • timeout
  • interval
  • IIFE
  • files
  • json
  • big numbers
  • promises
    • async await
    • streams
    • event emitter
    • errors
    • try/catch
    • exceptions
    • regex
    • exec
    • tcp server
    • udp server
    • http server
    • url parse
    • gzip
    • dns
    • crypto
    • env vars
    • cli args
    • cli flags
    • stdout
    • stderr
    • stdin
    • modules
    • stack trace
    • databases
    • testing
    • benchmarking
    • documentation
    • 《面向Nodejs开发者的Go》
    miguelmota
    2022-09-29
    目录

    promises

    # Node.js

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

    Output

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

    # Go

    (closest thing is to use channels)

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

    Output

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

    ⬆ back to top

    编辑 (opens new window)
    #Go#Node.js
    上次更新: 2022/09/30, 11:34:22
    big numbers
    async await

    ← big numbers async await→

    最近更新
    01
    咖啡知识
    10-13
    02
    documentation
    09-29
    03
    benchmarking
    09-29
    更多文章>
    Theme by Vdoing | Copyright © 2018-2022 csjiabin | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式