callback

call Stack调用栈
nodejs的每个事件循环,都是调用栈

setTimeout里面的错误,是不会被外面的 try catch所捕获的
callback 毁掉地狱

  1. function success(res) {
  2. if( res instance Error) {
  3. console.log('error');
  4. return
  5. }
  6. }
  7. function fn(callback) {
  8. setTimeout(() => {
  9. if(Matho.random > 0.8) {
  10. callback('success')
  11. }
  12. else {
  13. callback(throw new Error('error'))
  14. }
  15. })
  16. }

nodejs, error规范

  • 第一个参数都是错误,
  • 后面的参数才是结果

Promise

image.png
image.png

  1. function fn() {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. if(Matho.random > 0.8) {
  5. resolve('success')
  6. }
  7. else {
  8. reject(new Error('error'))
  9. }
  10. })
  11. })
  12. }
  13. const promise = fn()
  14. promise.then(res => {console.log(res)})
  15. .catch(err => {
  16. console.log('err', err)
  17. })

then会返回一个全新的 promise

  • 如果 then,或 catch里面 throw new Error,那么就是 reject状态
  • 如果 return 正常值,就是 resolve状态

image.png

async&await

async function 是 Promise 的语法糖封装
异步编程的终极方案 – 以同步的方式写异步

  1. async function() {
  2. return 100
  3. }
  4. // 等价于
  5. function() {
  6. return new Promise(resolve => resolve(100))
  7. }

await

await会等待后面的 Promise执行完成,才执行下面的
await 可以捕获 Promise的错误
image.png

  1. async function() {
  2. try {
  3. await Promise.all([])
  4. } catch(e) {
  5. return console.log('error', error)
  6. }
  7. }