加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

JS异步编程六种方案

发布时间:2019-01-30 17:28:51 所属栏目:优化 来源:浪里行舟
导读:副标题#e# 前言 我们知道Javascript语言的执行环境是单线程。也就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务。 这种模式虽然实现起来比较简单,执行环境相对单纯,但是只要有一个任务耗时很长,后面的任

1.Promise的三种状态

  •  Pending----Promise对象实例创建时候的初始状态
  •  Fulfilled----可以理解为成功的状态
  •  Rejected----可以理解为失败的状态

JS异步编程六种方案

这个承诺一旦从等待状态变成为其他状态就永远不能更改状态了,比如说一旦状态变为 resolved 后,就不能再次改变为Fulfilled

  1. let p = new Promise((resolve, reject) => {  
  2.   reject('reject')  
  3.   resolve('success')//无效代码不会执行  
  4. })  
  5. p.then(  
  6.   value => {  
  7.     console.log(value)  
  8.   },  
  9.   reason => {  
  10.     console.log(reason)//reject  
  11.   }  

当我们在构造 Promise 的时候,构造函数内部的代码是立即执行的

  1. new Promise((resolve, reject) => {  
  2.   console.log('new Promise')  
  3.   resolve('success')  
  4. })  
  5. console.log('end')  
  6. // new Promise => end 

2.promise的链式调用

  •  每次调用返回的都是一个新的Promise实例(这就是then可用链式调用的原因)
  •  如果then中返回的是一个结果的话会把这个结果传递下一次then中的成功回调
  •  如果then中出现异常,会走下一个then的失败回调
  •  在 then中使用了return,那么 return 的值会被Promise.resolve() 包装(见例1,2)
  •  then中可以不传递参数,如果不传递会透到下一个then中(见例3)
  •  catch 会捕获到没有捕获的异常

接下来我们看几个例子:

  1. // 例1  
  2. Promise.resolve(1)  
  3. .then(res => {  
  4.   console.log(res)  
  5.   return 2 //包装成 Promise.resolve(2)  
  6. })  
  7. .catch(err => 3)  
  8. .then(res => console.log(res))  
  1. // 例2  
  2. Promise.resolve(1)  
  3.   .then(x => x + 1)  
  4.   .then(x => {  
  5.     throw new Error('My Error')  
  6.   })  
  7.   .catch(() => 1)  
  8.   .then(x => x + 1)  
  9.   .then(x => console.log(x)) //2  
  10.   .catch(console.error)  
  1. // 例3  
  2. let fs = require('fs')  
  3. function read(url) {  
  4.   return new Promise((resolve, reject) => {  
  5.     fs.readFile(url, 'utf8', (err, data) => {  
  6.       if (err) reject(err)  
  7.       resolve(data)  
  8.     })  
  9.   })  
  10. }  
  11. read('./name.txt')  
  12.   .then(function(data) {  
  13.     throw new Error() //then中出现异常,会走下一个then的失败回调  
  14.   }) //由于下一个then没有失败回调,就会继续往下找,如果都没有,就会被catch捕获到  
  15.   .then(function(data) {  
  16.     console.log('data')  
  17.   })  
  18.   .then()  
  19.   .then(null, function(err) {  
  20.     console.log('then', err)// then error  
  21.   })  
  22.   .catch(function(err) {  
  23.     console.log('error')  
  24.   }) 

(编辑:我爱故事小小网_铜陵站长网)

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

热点阅读