1. promise构造函数中的reject和resolve是微任务, 即先执行resolve后的代码,再执行之前通过then注册的代码
2. 对于状态已变更的promise来说,比如promiseA已经是fullfilled,promiseA.then(function(){})依然将在微任务里执行
__________________总结:then里的回调函数永远是异步的microtask
3. then总是返回一个新的promise
4. catch相当于then(undefined, function(){}) 每个then里的两个回调函数相当于新promise的构造函数(二选一),链式调用时,后一个仅取决于前一个promise的状态
举例: A = new Promise(function(resolve, reject){reject('a')})
B=A.catch(function(error){return error})
C=B.then(function(res){console.log(res)},function(){console.log('error')}) // 打印 a
可以看到,A是failed,在B中catch了错误a,但是B作为一个new Promise,它里面没有扔出错误,是被resolve了(只有B的函数自己执行出错才会被reject),所以传到C时,执行的是第一个参数的成功回调函数,A的状态已经丢失了。
因此,链式调用时,catch应该放在最后,then里的函数不传,则会传递前一个promise的状态,最后一个catch可以捕捉到前面任意环节出的错
5. promise的构造函数被try..catch包裹着,如果在resolve之前抛出了error,就会直接reject,后面的resolve不起作用,因为promise的状态一经确定不会更改。