// demo1
// 定义的时候出错
// const p = new Promise(res => {
// throw new Error('type error')
// res(1)
// })
// p.then(res => {
// console.log(res)
// }, err => {
// console.log(err)
// })
// demo2
// 处理的时候出错
// const p = new Promise(res => {
// res(1)
// })
// p.then(res => {
// throw new Error('type error')
// console.log(res)
// }, err => {
// console.log(err)
// })
// .catch(err => {
// console.log(err)
// })
// demo3
// 链式调用
// Promise.resolve(20)
// .then(res => {
// console.log(res)
// return res * 2
// })
// .then(res => {
// console.log(res)
// })
// demo3
// 链式调用 含报错
// console.log(
// Promise.reject(20)
// .then(res => {
// console.log(res)
// })
// .catch(err => {
// console.log(err)
// })
// .then(res => {
// console.log(res)
// })
// )
// demo4 鸭子类型
// let thenable = {
// then(resolve, rejected) {
// resolve('resolve')
// rejected('error')
// }
// }
// thenable.then(res => {
// console.log(res)
// }, err => {
// console.log(err)
// })
// console.log(Promise.resolve(thenable))
// demo5
// console.log(
// Promise.resolve(20)
// .then(res => {
// // 代码出错 返回的是 rejected
// console.log(res.toLowerCase())
// }, err => {
// console.log(err)
// })
// )
// demo6
// then 里面是正常捕获 或者是 异常捕获 都可以return 出去 Promise
// console.log(
// Promise.resolve(20)
// Promise.reject(20)
// .then(null, err => {
// console.log('then')
// console.log(err )
// return false
// })
// .then(res => {
// console.log('res1==='+res)
// })
// .catch(err => {
// console.log( 'catch')
// console.log(err)
// })
// )
// demo7
// console.log(Promise.prototype)
// demo8
// 由于无法知道promise的最终状态,
// 所以finally的回调函数中不接收任何参数,
// 它仅用于无论最终结果如何都要执行的情况。
// Promise.prototype.done = function (onFulfilled, onRejected) {
// this
// .then(onFulfilled, onRejected)
// .catch(function (reason) {
// // 抛出一个全局错误
// setTimeout(() => {
// throw reason
// }, 0)
// })
// }
// console.log(
// Promise.resolve(20)
// .then(res => {
// console.log(res)
// return 'then'
// })
// .then(res => {
// console.log(res)
// throw new Error('error')
// return 'then1'
// })
// .catch(err => {
// console.log(err)
// throw new Error('error-catch')
// })
// .done(null, err => {
// console.log(err)
// })
// // .finally(() => {
// // console.log('finally')
// // })
// )
// demo9
// const p = new Promise((res, rej) => {
// res(123)
// })
// [[PromiseStatus]]: "resolved"
// [[PromiseValue]]: 123
// demo10
// console.log(Promise.resolve)
// demo11
// Promise.resolve(20)
// .then(res => {
// console.log(res)
// return 21
// })
// .then(res => {
// console.log(res)
// })
// Promise.resolve(30)
// .then(res => {
// console.log(res)
// return 31
// })
// demo 12
// const p = new Promise((res, rej) => {
// null.a = 1
// res(123)
// })
// console.log(p)
// p
// .then(res => {
// console.log(res)
// })
// .catch(err => {
// console.log(err)
// return 20
// })foo
// .then(res => {
// console.log(res)
// })
// demo13
// setTimeout(function[, delay, param1, param2, ...]);
// 箭头函数没有 arguments
// setTimeout(function (...args) {
// // setTimeout((...args) => {
// console.log(args)
// console.log(arguments)
// }, 0, 12, 12)
// demo14
// Promise.resolve 的 返回值类型处理
// 1. Promise.resolve
// const p = Promise.resolve(1)
// setTimeout(console.log, 0, p === Promise.resolve(p))
// 2. Promise.reject
// const pRej = Promise.reject(1)
// setTimeout(console.log, 0, pRej === Promise.resolve(pRej))
console