JavaScript如何处理并行请求?四种方式浅析


当前第2页 返回上一页

generator使用co函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

const co = require('co')

const startTime = new Date().getTime()

function request (time) {

  return new Promise(resolve => {

    setTimeout(() => {

      resolve(time)

    }, time)

  })

}

co(function* () {

  let request1 = request(3000);

  let request2 = request(2000);

  let res1 = yield request1

  let res2 = yield request2

  console.log(res1, res2, new Date() - startTime) // 3000 2000 3001

})

有了co函数,就不需要生成it和执行next方法了; co的原理其实也简单,就是递归执行next,直到done为true; 如果next返回的value是Promise,则在then函数中执行next,若不是Promise,直接执行next函数 下面是co函数的简版手写实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

function co(func) {

  let it = func()

  let t = it.next()

  next()

   

  function next() {

    if (t.done) return

    if (t.value instanceof Promise) {

      t.value.then(res => {

        t = it.next(res)

        next()

      })

    } else {

      t = it.next(t.value)

      next()

    }

  }

}

方法四

有了generator,很容易想到async/await,毕竟async/await就是由generator实现的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// setTimeout模拟异步请求,time为请求耗时

const startTime = new Date().getTime()

function request (time) {

  return new Promise(resolve => {

    setTimeout(() => {

      resolve(time)

    }, time)

  })

}

(async function () {

  let request1 = request(3000)

  let request2 = request(2000)

  let res1 = await request1

  console.log(res1, new Date() - startTime) // 3000 3001

  let res2 = await request2

  console.log(res2, new Date() - startTime) // 2000 3005

})()

更多编程相关知识,请访问:编程视频!!

以上就是JavaScript如何处理并行请求?四种方式浅析的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

bootstrap请求javascript失败是怎么回事

javascript中日期如何转为时间戳

javascript中如何产生两个随机数

js如何获取session中的值

深入浅析 promise 比 settimeout() 快的原因

javascript中怎么改字体颜色

javascript怎么隐藏表格

js怎么设置css实现隐藏

javascript未知错误怎么查

javascript中变量是什么

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...