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

 4397

本篇文章和大家看看JavaScript如何处理并行请求?介绍一下JS处理并行请求的四种方式,希望对大家有所帮助!


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


需求

两个异步请求同时发出,两个请求都返回时再做处理

实现

这里的方法仅提供思路,只做请求成功处理


方法一

使用Promise.all

  1. const startTime = new Date().getTime()
  2. function request(time) {
  3.   return new Promise(resolve => {
  4.     setTimeout(() => {
  5.       resolve(time)
  6.     }, time)
  7.   })
  8. }
  9. let request1 = request(3000)
  10. let request2 = request(2000)
  11. Promise.all([request1, request2]).then(res => {
  12.   console.log(res, new Date() - startTime)  // [ 3000, 2000 ] 3001
  13. })


方法二

自定义状态,在回调中判断返回状态,待2个请求都有返回值时再做处理

  1. const startTime = new Date().getTime()
  2. function request(time) {
  3.   return new Promise(resolve => {
  4.     setTimeout(() => {
  5.       resolve(time)
  6.     }, time)
  7.   })
  8. }
  9. let state = [undefined, undefined]
  10. let request1 = request(3000)
  11. let request2 = request(2000)
  12. request1.then(res => {
  13.   state[0] = res
  14.   process()
  15. })
  16. request2.then(res => {
  17.   state[1] = res
  18.   process()
  19. })
  20. function process() {
  21.   if (state[0] && state[1]) {
  22.     console.log(state, new Date() - startTime) // [ 3000, 2000 ] 3001
  23.   }
  24. }


方法三

generator,yield

  1. const startTime = new Date().getTime()
  2. function ajax(time, cb) {
  3.   setTimeout(() => cb(time), time)
  4. }
  5. function request(time) {
  6.   ajax(time, data => {
  7.     it.next(data);
  8.   })
  9. }
  10. function* main() {
  11.   let request1 = request(3000);
  12.   let request2 = request(2000);
  13.   let res1 = yield request1
  14.   let res2 = yield request2
  15.   console.log(res1, res2, new Date() - startTime) // 2000 3000 3001
  16. }
  17. let it = main();
  18. it.next();

这个地方有点问题,因为request2耗时较短,会先返回,也就是先执行it.next(2000),导致res1获得了request2的返回值若使用co函数,则不会存在这个问题,因为co是在promise.then函数中才执行it.next(),相当于it.next()是链式调用


generator使用co函数

  1. const co = require('co')
  2. const startTime = new Date().getTime()
  3. function request (time) {
  4.   return new Promise(resolve => {
  5.     setTimeout(() => {
  6.       resolve(time)
  7.     }, time)
  8.   })
  9. }
  10. co(function* () {
  11.   let request1 = request(3000);
  12.   let request2 = request(2000);
  13.   let res1 = yield request1
  14.   let res2 = yield request2
  15.   console.log(res1, res2, new Date() - startTime) // 3000 2000 3001
  16. })

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

  1. function co(func) {
  2.   let it = func()
  3.   let t = it.next()
  4.   next()
  5.    
  6.   function next() {
  7.     if (t.done) return
  8.     if (t.value instanceof Promise) {
  9.       t.value.then(res => {
  10.         t = it.next(res)
  11.         next()
  12.       })
  13.     } else {
  14.       t = it.next(t.value)
  15.       next()
  16.     }
  17.   }
  18. }


方法四

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

  1. // setTimeout模拟异步请求,time为请求耗时
  2. const startTime = new Date().getTime()
  3. function request (time) {
  4.   return new Promise(resolve => {
  5.     setTimeout(() => {
  6.       resolve(time)
  7.     }, time)
  8.   })
  9. }
  10. (async function () {
  11.   let request1 = request(3000)
  12.   let request2 = request(2000)
  13.   let res1 = await request1
  14.   console.log(res1, new Date() - startTime) // 3000 3001
  15.   let res2 = await request2
  16.   console.log(res2, new Date() - startTime) // 2000 3005
  17. })()


本文网址:https://www.zztuku.com/index.php/detail-9037.html
站长图库 - JavaScript如何处理并行请求?四种方式浅析
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐