# 链式调用的三种情况

异步方法无法通过try、catch捕获异常

链式调用

核心:
promise成功或失败的回调函数返回值,可以传递到外层的下一个then方法中

每次执行完promise. then方法后返回的都是一个的promise,不能返回同一个promise实例,如果是一个promise的话,很有可能会出现先成功后失败的状态与规范不符合

情况1:如果成功/失败的回调函数返回的是普通值的话(会传递到下一次的成功中),出错的话(一定会传到下一次的失败)

情况2:如果成功/失败的回调函数返回的是promise的话,根据promise的状态(成功/失败),决定走下一次的成功回调还是失败回调。

情况3:错误处理:如果离自己最近的then 没有错误处理(指的是错误处理函数)的话 会向下找

fs. readFile('. /name. txt', 'utf8', (err, data) => {
  fs. readFile(data, 'utf8', (err, data) => {
    console.log(data)
  })
})

# 情况1 (读取文件成功/失败,或抛出异常时)

// (读取文件成功) 只要返回普通值都走下一个 then的成功回调
read('. /name. txt'). then((data) => {
  return 100
}, (err) => {
  return 200
}). then((data) => {
  console. log('------', data) // 100
}, (err) => {

})

// (读取文件失败) 只要返回普通值都走下一个 then的成功回调
read('. /name123. txt'). then((data) => {
  return 100
}, (err) => {
  return 200
}). then((data) => {
  console. log('------', data) // 200
}, (err) => {

})

// (读取文件失败) 执行失败的回调时,跑出了错误,必定走向下一个then的失败回调中
read('. /name123. txt'). then((data) => {
  return 100
}, (err) => {
  throw new Error('err')
}). then((data) => {
  console. log('------', data) // 200
}, (err) => {
  console. log('---------', err+'错误') // --------- Error: err错误
})

# 情况2

(成功/失败的回调中,返回的是一个promise对象,等promise成功或失败)

回调中的promise是成功态时,会走向下一个then的成功回调中

回调中的promise是失败态时,会走向下一个then的失败回调中

// promise成功态,走向下一个then的成功态
read('. /name. txt'). then((data) => {
  return read(data)
}, (err) => {

}). then((data) => {
  console. log('------', data)  // 10
}, err => {
  console. log('---------', err+'错误')
})

// promise失败态,走向下一个then的失败态
read('. /name. txt'). then((data) => {
  return read(data+'1')
}, (err) => {

}). then((data) => {
  console. log('------', data)  
}, err => {
  console. log('---------', err+'错误')  // --------- Error: ENOENT: no such file or directory, open 'age. txt1'错误
})

// 读取错误文件,执行reject(), 当执行了错误状态的回调函数时,会默认返回一个undefined,普通值走向下一个then的成功方法
read('. /name123. txt'). then((data) => {
  return read(data)
}, (err) => {
   // return undefined
}). then((data) => {
  console. log('------', data)  // ------ undefined
}, err => {
  console. log('---------', err+'错误')
})

# 情况3

如果就近的错误没处理,就会向下查找 到下一个then的失败方法

// 如果就近的错误没处理,就会向下查找
read('. /name123. txt'). then((data) => {
  return read(data)
}). then((data) => {
  console. log('------', data)  
}, err => {
  console. log('---------', err+'错误') // Error: ENOENT: no such file or directory, open '. /name123. txt'错误
})