Promise
Promise.resolve() 创建一个成功或失败
| Promise.resolve('s');Promise.resolve(new Promise((resolve, reject) => reject()));
 
 | 
Promise.reject() 创建一个失败
| Promise.reject('错误').then(null, reason => console.log(reason))
 | 
Promise.all() 所有都成功,或者有一个失败
| Promise.all([Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]).then(values => console.log(values))
 Promise.all([Promise.resolve(1), Promise.reject(2), Promise.reject(3)])
 .then(null, reason => console.log(reason))
 
 | 
Promise.race() 返回第一个改变状态的结果
| Promise.race([Promise.resolve(1), Promise.resolve(2)]).then(values => console.log(values))
 Promise.race([Promise.reject(1), Promise.resolve(2)])
 .then(null, reason => console.log(reason))
 
 | 
Promise.allSettled() 返回所有的结果
| Promise.allSettled([Promise.reject(1), Promise.resolve(2), Promise.resolve(3)]).then(values => console.log(values)) 
 | 
用 Promise.all()  模拟 allSettled
| const allSettled = promise => promise.then(fulfilled => ({status: 'fulfilled', value: fulfilled}),
 rejected => ({status: 'rejected', value: rejected})
 )
 Promise.all([
 allSettled(Promise.reject(1)), allSettled(Promise.resolve(2)), allSettled(Promise.reject(3))
 ]).then(values => console.log(values))
 
 
 const allSettled = promiseList => Promise.all(promiseList.map(
 promise => promise.then(
 fulfilled => ({status: 'fulfilled', value: fulfilled}),
 rejected => ({status: 'rejected', value: rejected})
 )
 ))
 allSettled([Promise.reject(1), Promise.resolve(2), Promise.reject(3)])
 .then(values => console.log(values))
 
 | 
链式调用
| Promise.resolve('hello').then(res => Promise.resolve(`${res}, world`)).then(res => console.log(res))
 | 
错误处理
| Promise.reject('hello').then(res => console.log(`success:${res}`)).catch(res => console.log(`error:${res}`)) 
 Promise.reject('hello').then(res => console.log(`success:${res}`)).then(null, res => console.log(`error:${res}`))
 
 Promise.reject('hello').then(null, res => console.log(`error:${res}`))
 
 | 
 async
await 只能在 async 函数里使用,async 函数会返回一个 Promise
| function fn () {return new Promise(resolve => {
 resolve('hi')
 })
 }
 async function fn2 () {
 let result = await fn()
 console.log(result)
 }
 
 | 
try catch 捕获异常
| function ajax () {return new Promise((resolve, reject) => {
 reject('出错了')
 })
 }
 async function fn () {
 try {
 let result = await ajax()
 console.log(result)
 } catch (error) {
 console.log(`error:${error}`)
 }
 }
 fn()
 
 | 
使用 catch 捕获异常
| function ajax () {return new Promise((resolve, reject) => {
 reject('出错了')
 })
 }
 async function fn () {
 let result = await ajax().catch(error => console.log(`error:${error}`))
 console.log(result)
 }
 fn()
 
 | 
await 会使等号左边的代码变成异步
| function fn2 () { console.log('fn2:同步1')
 Promise.resolve('Promise').then(result => console.log(result))
 console.log('fn2:同步2')
 }
 async function fn () {
 console.log('同步')
 let result = await fn2()
 console.log('异步')
 }
 fn()
 
 
 
 
 
 
 | 
 简单实现 Promise
| class Promise {success = []
 error = []
 resolve = (data) => {
 setTimeout(() => {
 for (let i = 0; i < this.success.length; i++) {
 this.success[i](data);
 }
 })
 }
 reject = (data) => {
 setTimeout(() => {
 for (let i = 0; i < this.error.length; i++) {
 this.error[i](data);
 }
 })
 }
 constructor(fn) {
 fn(this.resolve, this.reject)
 }
 then(success, error) {
 this.success.push(success)
 error && this.error.push(error)
 return this
 }
 }
 
 let p1 = new Promise2((resolve, reject) => {
 resolve('success')
 })
 p1.then((res) => {
 console.log(res);
 }).then((res) => {
 console.log(res);
 })
 
 |