• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. Promise.resolve 和 Promise.reject

Promise(2)

2018-04-20 19:45:09
总字数 585
预计阅读时间 2 分钟

如果只是执行一次单步回调 , 那么传统的回调函数执行的方式其实并没有什么问题

Promise的主要意义是在于解决多重回调的多层嵌套问题
如果回调的嵌套层级太多 , 会造成代码可读性很差 , 难以维护

如果我们要使用setTimeout来构造一个顺序异步执行的过程
需要这样做

1
2
3
4
5
6
7
8
9
10
11
12
13
function test(num, func) {
setTimeout(function(){
console.log(num)
func(num)
}, 0)
}
test(1, function(a){
test(2, function(b){
test(3, function(c){
console.log("回调成功")
})
})
})

使用Promise可以将上述的代码改造成线性的模式 , 可读性增强 , 同时也更便于调试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new Promise(function(resolve, reject){
resolve(1)
}).then(function(val){
console.log(val)
return new Promise(function(resolve, reject){
resolve(2)
})
}).then(function(val){
console.log(val)
return new Promise(function(resolve, reject){
resolve(3)
})
}).then(function(val){
console.log(val)
})

让then方法的函数每次都是返回不同的Promise实例 , 再去指定这个实例的回调函数即可

并且对于Promise对象 , 它对于resolve和reject的执行是异步的
例如 :

1
2
3
4
5
6
7
8
9
10
11
12
new Promise(function(resolve, reject){
console.log("AA");
resolve("BB");
}).then(function(msg){
console.log(msg);
});
console.log("CC");
/* output:
AA
CC
BB
*/

Promise.resolve 和 Promise.reject

Promise.resolve方法会返回一个Promise实例
分为下面几种情况

  1. 参数是一个Promise实例
    将不做任何修改, 直接返回这个Promise实例

  2. 参数是一个thenable对象
    thenable对象意思是这个对象当中带有then属性, 值是一个函数, 接收参数resolve和reject两个函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const p1 = Promise.resolve({
    then: (resolve, reject) => {
    resolve('异步回调执行')
    }
    })
    // 等价于如下写法
    const p2 = new Promise((resolve, reject) => {
    resolve('异步回调执行')
    })
  3. 参数是不具有then方法的对象

    1
    2
    3
    4
    5
    const p1 = Promise.resolve('Hello')
    // 等价于如下写法
    new Promise((resolve, reject) => {
    resolve('Hello')
    })
  4. 没有任何参数

    1
    2
    3
    4
    5
    const p1 = Promise.resolve()
    // 等价于如下写法
    new Promise((resolve, reject) => {
    resolve()
    })

    其实实际效果可以归为到第三类


Promise.reject方法就相对比较简单了
只有这一种情况

1
2
3
4
5
Promise.reject('Error')
// 等价于如下写法
new Promise((resolve, reject) => {
reject('Error')
})

不论传入什么参数, 都会传递给reject

  • JavaScript
  • Promise
  • JavaScript

扫一扫,分享到微信

ES6的重要新特性
Promise(1) 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆