Promise(三)

then方法

  1. 同一个promise的then方法可以调用多次

    let fnPromise=() => {
      return new Promise((resolve,reject) => {resolve('被调用')})
    }
    
    fnPromise().then(res => {console.log(`第一次${res}`)})    --> 第一次被调用
    
    fnPromise().then(res => {console.log(`第二次${res}`)})    --> 第二次被调用
    
    fnPromise().then(res => {console.log(`第三次${res}`)})    --> 第三次被调用

    备注: 只要resolve方法被调用,那么该promise的.then方法都会被调用

  2. then方法的返回值
    (1) then方法的返回值是一个promise对象
    (2) 如果then函数return的是一个普通值(基础/引用类型),那么整个then函数的返回值是一个新的promise对象,里面的resolve传递的是then函数中return的值,所以可以链式调用

let promiseFn=() => {
  return new Promise( (resolve,reject)=>{
    resolve()
  } )
}

/* 
  promiseFn().then(res => 3) 这个返回值就是 new Promise( (resolve,reject)=>{ resolve(3) } )
*/

promiseFn().then(res => 3).then(res => {console.log(res)}) --> 3

(3) 如果then函数return的是一个promise对象,依然返回一个新的promise对象,但是resolve中的参数变成了return的promise对象,那么下一个then方法的时机就与return的promise对象有关( 最终变成了resolve中的传参是promise对象的形式 )

let promiseFn=() => {
  return new Promise( ()=>{
      resolve()
  } )
}
/*
  promiseFn().then(res => new Promise((resolve)=>{ resolve() })) 这个返回值就是 new Promise( (resolve,reject)=>{ resolve( new Promise((resolve)=>{resolve()}))} )
  当resolve的参数是promise对象时,则接下来的操作时机就与resolve中的promise对象有关
*/
let value=promiseFn().then(res => new Promise((resolve)=>{ resolve() })).then(res => {console.log(res)})

备注: 如果返回值是一个对象并且该对象实现了thenable,那么也是相同的理论


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!