Promise

# Promise

# 基础用法

function loadScript(src){
  return new Promise((resolve,reject)=>{
    // 异步操作
    const script = document.createElement('script')
    script.src = src
    script.onload = ()=>{
      resolve(src)
    }
    script.onerror = (err)=>{
      reject(err)
    }
    document.body.append(script)
  })
}

// promise 返回的是 promise 对象
loadScript('./1.js')
  .then(()=>{
    loadScript('./2.js')
    // return loadScript('./xxx.js') // 设置 return 能够在报错时停止执行后面的 then 而进入 catch 状态
  })
  .then(loadScript('./3.js'))
  .catch(err=>{
    console.log(err)
  })

# 静态方法

Promise.resolve(1) // 将静态值 转成 promise对象 执行 then
Promise.reject(1) // 将静态值 转成 promise对象 执行 catch

# 错误捕获

loadScript('./1.js')
  .then(()=>{
    return loadScript('./2.js') // 设置 return 能够在报错时停止执行后面的 then 而进入 catch 状态
  })
  .then(()=>{
    return loadScript('./3.js')
  })
  .catch(err =>{
    console.log(err) // 只要有 reject 抛出异常 都将进入 catch 并停止向下执行
  })

# 异步并发

const p1 = Promise.resolve(1)
const p3 = Promise.resolve(2)
const p3 = Promise.resolve(3)

// Promise.all() 将所以异步数据的结果放在一个数组中
Promise.all([p1,p2,p3]).then(res=>{
  console.log(res) // [1,2,3]
})

# 异步竞速

Promise.race() 将多个异步操作中最先获取到的数据作为最终值 (先到先得)

const p1 = () => {
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(1)
    },2000)
  })
}

const p2 = () => {
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(12)
    },3000)
  })
}
Promise.race([p1(),p2()]).then(res=>{
  console.log(res) // 1 取先获取到的数据
})