console.log(typeof (Promise)); //function //或 console.dir(Promise);
    
let promise = new Promise((resolve, reject) => {
  resolve('fulfilled')
  reject('rejected')
})
promise.then(res => {
  console.log(res);
}, err => {
  console.log(err);
})
promise.catch(err => {
  console.log(err);
})
promise.finally(log => {
  console.log('ending for log');
})
      
let promise = new Promise((resolve, reject) => {
  resolve('fulfilled')
  reject('rejected')
})
  .then(res => {
    console.log(res);
  }, err => {
    console.log(err);
  })
  .catch(err => {
    console.log(err);
  })
  .finally(log => {
    console.log('ending for log');
})
    
function loadData() {
  return new Promise((res, rej) => {
    setTimeout(() => {
      res([1, 2, 3, 4, 5])
    }, 3000)
  })
}
loadData().then(res => {
  console.log(res);
  return res
})
    . 待处理 - 调用 Promise 时,初始状态为 pending,表示还没有开始
let promise = new Promise((resolve, reject) => {
})
console.log(promise);
      . 执行成功时,调用 resolve,将 Promise 的状态改为 fulfilled
let promise = new Promise((resolve, reject) => {
  resolve('fulfilled')
})
console.log(promise);
promise.then(res => {
  console.log(res);
})
      . Promise 执行过程中遇到错误或者无法完成预期操作时,Promise 的状态改为 rejected
let promise = new Promise((resolve, reject) => {
  reject('rejected')
})
console.log(promise);
promise.catch(err => {
  console.log(err);
})
      
let flag = false
let promise = new Promise((resolve, reject) => {
  flag ? resolve('data: fulfilled') : reject('data rejected');
})
  .then(res => {
    console.log(res);
  }, err => {
    console.log('then err', err); //拒绝后,如果这里处理过了,catch() 就不再处理
  })
  .catch(err => {
    console.log('catch err', err);  //如果 then() 中没有处理异常,这里就必须处理
  })
  .finally(log => {
    console.log('ending for log');
  })
    . 访问错误
. 网络链接失败、请求超时
. 服务器返回 404 错误或非 2xx 或 3xx 状态码
. promise链中任何一个抛出的错误
let promise = fetch(url)
promise.then(resolve => {
    //fulfillment handle
}, reject => {
    //rejection handle
})  
      
let promise = fetch(url)
promise.then(resolve => {
//fulfillment handle
})  
      
let promise = fetch(url)
promise.then(null, reject => {
    //rejection handle
})  
    | 分类 | 说明 | 
|---|---|
| 运行时错误 | 程序执行过程中发生的错误,例如除以零、数组越界、空指针引用等 | 
| 自定义异常 | 自定义异常来表示特定的错误条件或业务规则违反 | 
| 系统异常 | 操作系统或编程语言环境可能会抛出一些系统级别的异常,比如文件未找到、权限不足等 | 
| 库或框架异常 | 使用第三方库或框架时,如果调用的方法内部出现错误,这些库或框架可能会抛出异常 | 
| 类型异常 | 在强类型语言中,类型不匹配或其他类型相关的错误也可能导致异常 | 
| 逻辑错误 | 逻辑错误通常不会立即导致程序崩溃;某些情况下,可以选择通过抛出异常的方式来中断程序流程,便于调试和处理 | 
let promise = fetch(url)
promise.catch(reject => {
    //rejection handle
})  
      
let promise = fetch(url)
promise.then(resolve => {
  //fulfillment handle
})
promise.catch(reject => {
    //rejection handle
}) 
    
let promise = fetch(url)
promise.finally(log => {
  console.log('log', log);
})
    
let promises = Promise
  .all([f0(), f1(), f2()])
  .then(e => {
    console.log('all ok')
    console.dir(e)
  })
  .catch(err => {
    console.log('err', err)
  })
  .finally(() => {
    console.log('all done')
  })
function f0() {
  return fetch('/utils/data/cart.json')
    .then(res => res.json())
}
function f1() {
  return fetch('/utils/data/form.json')
    .then(res => res.json())
}
function f2() {
  return fetch('/utils/data/coffee.json')
    .then(res => res.json())
}
    
let promise = fetch(url)
promise.then(res => {
    // fulfillment handle
}).catch(err => {
    // rejection handle
}).finally(log => {
    // finally handle
})      
      
pa()
.then(res => {  // 拿到的是pa的结果
  console.log(res);
  return pb()
})
.then(res => {  //拿到的是pb的结果
  console.log(res);
  return pc()
})
.then(res => {  //拿到的是pc的结果
  console.log(res);
})