三十六、Promise

一、Promise 是异步编程的一种解决方案

二、什么时候会处理异步事件

  • 一种很常见的场景应该就是网络请求了。
  • 我们封装一个网络请求的函数,因为不能立即拿到结果,所以不能像简单的3+4=7一样将结果返回。
  • 所以往往我们会传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调出去。
  • 如果只是一个简单的网络请求,那么这种方案不会给我们带来很大的麻烦。 

三、当网络请求非常复杂时,就会出现回调地狱

如下所示(不容易进行维护,且非常难看):

  • 我们需要通过一个url1从服务器加载一个数据datal, datal中包含了下一个请求的url2
  • 我们需要通过datal取出url2,从服务器加载数据data2, data2中包含了下一个请求的url3
  • 我们需要通过data2取出url3,从服务器加载数据data3, data3中包含了下一个请求的url4
  • 发送网络请求url4,获取最终的数据data4

 四、一般情况当有异步操作时,使用Promise对这个异步进行封装(如下是Promise的基本使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//一般情况下有异步操作时,使用Promise对这个一部操作进行封装
// new -> 构造函数(1.保存了一些状态信息 2.执行传入的函数)
//在执行传入的回调函数时,会传入两个参数,resolve ,reject  本身又是函数
new Promise((resolve, reject)=>{
  //模拟网络请求
  setTimeout(()=>{
    //成功的时候调用 resolve
    resolve("Hello Worlds")
 
    //失败的时候调用reject
    reject('error message')
  },1000)
}).then((data)=>{
  //100行的处理代码
  console.log(data);
}).catch((err)=>{
  console.log(err);
})

另外一种写法

1
2
3
4
5
6
7
8
9
10
new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve('hellow vuejs')
    //reject('error message')
  },1000)
}).then(data=>{
  console.log(data);
},err=>{
  console.log(err);
})

五、Promise处理异步操作会有三种状态

pending:等待状态,比如正在进行网络请求,或者定时器没有到时间

fulling:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()

reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()

六、Promise的链式调用

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
<script>
  //进行了一次网络请求:aaa -》自处理(10行)
  //处理:aaa111 -> 自己处理(10行)
  //处理:aaa111222 -》自己处理
  // new Promise((resolve, reject)=>{
  //   setTimeout(()=>{
  //     resolve('aaa')
  //   },1000)
  // }).then((res)=>{
  //   //1.自己处理10行代码
  //   console.log(res, '第一层的10行处理代码')
 
  //   //2.对结果进行第一次处理
  //   return new Promise((resolve)=>{
  //     resolve(res + '111')
  //   })
  // }).then((res)=>{
  //   console.log(res, '第二层的10行处理代码')
 
  //   return new Promise((resolve)=>{
  //     resolve(res + '222')
  //   })
  // }).then((res)=>{
  //   console.log(res, '第三层的10行处理代码')
  // })
 
  //new Promise(resolve => resolve(结果))简写
  // new Promise((resolve, reject)=>{
  //   setTimeout(()=>{
  //     resolve('aaa')
  //   },1000)
  // }).then((res)=>{
  //   //1.自己处理10行代码
  //   console.log(res, '第一层的10行处理代码')
 
  //   //2.对结果进行第一次处理
  //   return Promise.resolve(res + '111')
  // }).then((res)=>{
  //   console.log(res, '第二层的10行处理代码')
 
  //   return Promise.resolve(res + '222')
  // }).then((res)=>{
  //   console.log(res, '第三层的10行处理代码')
  // })
 
  //省略掉 Primise.resolve
  new Promise((resolve, reject)=>{
    setTimeout(()=>{
      resolve('aaa')
    },1000)
  }).then((res)=>{
    //1.自己处理10行代码
    console.log(res, '第一层的10行处理代码')
 
    //2.对结果进行第一次处理
    return res + '111'
  }).then((res)=>{
    console.log(res, '第二层的10行处理代码')
 
    return res + '222'
  }).then((res)=>{
    console.log(res, '第三层的10行处理代码')
  })
</script>

七、Promise的all方法的使用

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
<script>
  Promise.all([
    // new Promise((resolve, reject)=>{
    //   $ajax({
    //     url:'url1',
    //     success: function(data){
    //       resolve(data)
    //     }
    //   })
    // }),
    // new Promise((resolve, reject)=>{
    //   $ajax({
    //     url:'url2',
    //     success: function(data){
    //       resolve(data)
    //     }
    //   })
    // })
 
    new Promise((resolve, reject)=>{
      setTimeout(()=>{
        resolve('result1')
      },2000)
    }),
    new Promise((resolve, reject)=>{
      setTimeout(()=>{
        resolve('result2')
      },1000)
    })
  ]).then(results =>{
    console.log(results[0])
    console.log(results[1])
  })
</script>

  

  

posted @   搬砖工具人  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示