加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

JS异步编程六种方案

发布时间:2019-01-22 08:00:15 所属栏目:建站 来源:浪里行舟
导读:媒介 我们知道Javascript说话的执行情形是单线程。也就是指一次只能完成一件使命。假若有多个使命,就必需列队,前面一个使命完成,再执行后头一个使命。 这种模式固然实现起来较量简朴,执行情形相对纯真,可是只要有一个使命耗时很长,后头的使命都必需

Promise不只可以或许捕捉错误,并且也很好地办理了回调地狱的题目,可以把之前的回调地狱例子改写为如下代码:

  1. ajax(url)  
  2.   .then(res => {  
  3.       console.log(res)  
  4.       return ajax(url1)  
  5.   }).then(res => {  
  6.       console.log(res)  
  7.       return ajax(url2)  
  8.   }).then(res => console.log(res)) 

它也是存在一些弱点的,好比无法打消 Promise,错误必要通过回调函数捕捉。

六、天生器Generators/ yield

Generator 函数是 ES6 提供的一种异步编程办理方案,语法举动与传统函数完全差异,Generator 最大的特点就是可以节制函数的执行。

  •  语法上,起首可以把它领略成,,Generator 函数是一个状态机,封装了多个内部状态。
  •  Generator 函数除了状态机,照旧一个遍历器工具天生函数。
  •  可停息函数, yield可停息,next要领可启动,每次返回的是yield后的表达式功效。
  •  yield表达式自己没有返回值,可能说老是返回undefined。next要领可以带一个参数,该参数就会被看成上一个yield表达式的返回值。

我们先来看个例子:

  1. function *foo(x) {  
  2.   let y = 2 * (yield (x + 1))  
  3.   let z = yield (y / 3)  
  4.   return (x + y + z)  
  5. }  
  6. let it = foo(5)  
  7. console.log(it.next())   // => {value: 6, done: false}  
  8. console.log(it.next(12)) // => {value: 8, done: false}  
  9. console.log(it.next(13)) // => {value: 42, done: true} 

也许功效跟你想象纷歧致,接下来我们逐行代码说明:

  •  起首 Generator 函数挪用和平凡函数差异,它会返回一个迭代器
  •  当执行第一次 next 时,传参会被忽略,而且函数停息在 yield (x + 1) 处,以是返回 5 + 1 = 6
  •  当执行第二次 next 时,传入的参数12就会被看成上一个yield表达式的返回值,假如你不传参,yield 永久返回 undefined。此时 let y = 2 12,以是第二个 yield 便是 2 12 / 3 = 8
  •  当执行第三次 next 时,传入的参数13就会被看成上一个yield表达式的返回值,以是 z = 13, x = 5, y = 24,相加便是 42

我们再来看个例子:有三个当地文件,别离1.txt,2.txt和3.txt,内容都只有一句话,下一个哀求依靠上一个哀求的功效,想通过Generator函数依次挪用三个文件

  1. //1.txt文件  
  2. 2.txt  
  1. //2.txt文件  
  2. 3.txt  
  1. //3.txt文件  
  2. 竣事  
  1. let fs = require('fs')  
  2. function read(file) {  
  3.   return new Promise(function(resolve, reject) {  
  4.     fs.readFile(file, 'utf8', function(err, data) {  
  5.       if (err) reject(err)  
  6.       resolve(data)  
  7.     })  
  8.   })  
  9. }  
  10. function* r() {  
  11.   let r1 = yield read('./1.txt')  
  12.   let r2 = yield read(r1)  
  13.   let r3 = yield read(r2)  
  14.   console.log(r1)  
  15.   console.log(r2)  
  16.   console.log(r3)  
  17. }  
  18. let it = r()  
  19. let { value, done } = it.next()  
  20. value.then(function(data) { // value是个promise  
  21.   console.log(data) //data=>2.txt  
  22.   let { value, done } = it.next(data)  
  23.   value.then(function(data) {  
  24.     console.log(data) //data=>3.txt  
  25.     let { value, done } = it.next(data)  
  26.     value.then(function(data) {  
  27.       console.log(data) //data=>竣事  
  28.     })  
  29.   })  
  30. })  
  31. // 2.txt=>3.txt=>竣事 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读