2018-12-06 14:45:28 +08:00

2.7 KiB

title date tags categories
Promise(2) 2018-4-20 19:45:09
JavaScript
Promise
JavaScript

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

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

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

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可以将上述的代码改造成线性的模式 , 可读性增强 , 同时也更便于调试

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的执行是异步的 例如 :

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两个函数

const p1 = Promise.resolve({
  then: (resolve, reject) => {
    resolve('异步回调执行')
  }
})
// 等价于如下写法
const p2 = new Promise((resolve, reject) => {
  resolve('异步回调执行')
})
  1. 参数是不具有then方法的对象
const p1 = Promise.resolve('Hello')
// 等价于如下写法
new Promise((resolve, reject) => {
  resolve('Hello')
})
  1. 没有任何参数
const p1 = Promise.resolve()
// 等价于如下写法
new Promise((resolve, reject) => {
  resolve()
})

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


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

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

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