# 链式调用的三种情况
异步方法无法通过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'错误
})