SOURCE

// 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 命令行工具 X clear

                    
>
console