异步编程之Promise
一、Promise
1. .then 和.catch
· resolved 状态的Promise 会回调后面的第一个.then
· rejected 状态的Promise 会回调后面的第一个.catch
任何一个rejected 状态且后面没有.catch 的Promise,都会造成浏览器/node 环境
的全局错误
/**
* promise的状态转换以及通过then获取内容
*/
const promise = new Promise((resolve, reject) => {
setTimeout(function () {
resolve(3);
// reject(new Error(4))
}, 500)
})
promise
.then(function (result) {
console.log(result)
})
// .catch(function (err) {
// })
setTimeout(() => {
console.log(promise)
}, 800)
2.执行then 和catch 会返回一个新Promise,该Promise 最终状态根据then 和catch 的回调函数的执行结果决定
· 如果回调函数最终是throw,该Promise 是rejected 状态
· 如果回调函数最终是return,该Promise 是resolved 状态
/**
* promise的链式调用
*/
interview(1)
.then(()=> {
return interview(2);
})
.then(()=> {
return interview(3);
})
.then(()=> {
if (Math.random() > 0.1) {
const error = new Error('keyboard')
error.round = 'keyboard'
throw error
}
})
.catch((err)=> {
console.log('cry at ' + err.round)
})
function interview(round) {
return new Promise((resolve, reject) => {
setTimeout(()=> {
if (Math.random() < 0.2) {
const error = new Error('failed');
error.round = round;
reject(error);
} else {
resolve('success');
}
}, 500)
})
}
3.Promise.all
/**
* Promise的最后一个例子,把前面的例子都整合进来了
* 进行三轮面试,都通过之后征求所有家庭成员的同意
* 只要有一处不通过则面试失败
* 通过Promise.all完成异步并行任务
*/
interview(1)
.then(() => {
return interview(2);
})
.then(() => {
return interview(3);
})
.then(() => {
return Promise.all([
family('father').catch(() => { /* 忽略老爸的的反对意见 */ }),
family('mother'),
family('wife'),
]).catch(e => {
e.round = 'family'
throw e;
})
})
.then(() => {
console.log('success');
})
.catch((err) => {
console.log('cry at ' + err.round)
})
function interview(round) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.2) {
const error = new Error('failed');
error.round = round;
reject(error);
} else {
resolve('success');
}
}, 500)
})
}
function family(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.2) {
const error = new Error('disagree');
error.name = name;
reject(error);
} else {
resolve('agree');
}
}, Math.random() * 400)
})
}
赞 (0)