callback
call Stack调用栈
nodejs的每个事件循环,都是调用栈
setTimeout里面的错误,是不会被外面的 try catch所捕获的
callback 毁掉地狱
function success(res) {
if( res instance Error) {
console.log('error');
return
}
}
function fn(callback) {
setTimeout(() => {
if(Matho.random > 0.8) {
callback('success')
}
else {
callback(throw new Error('error'))
}
})
}
nodejs, error规范
- 第一个参数都是错误,
- 后面的参数才是结果
Promise
function fn() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(Matho.random > 0.8) {
resolve('success')
}
else {
reject(new Error('error'))
}
})
})
}
const promise = fn()
promise.then(res => {console.log(res)})
.catch(err => {
console.log('err', err)
})
then会返回一个全新的 promise
- 如果 then,或 catch里面 throw new Error,那么就是 reject状态
- 如果 return 正常值,就是 resolve状态
async&await
async function 是 Promise 的语法糖封装
异步编程的终极方案 – 以同步的方式写异步
async function() {
return 100
}
// 等价于
function() {
return new Promise(resolve => resolve(100))
}
await
await会等待后面的 Promise执行完成,才执行下面的
await 可以捕获 Promise的错误
async function() {
try {
await Promise.all([])
} catch(e) {
return console.log('error', error)
}
}