promise是什么?
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
如何使用promise?
首先把异步函数想象成一个打电话的过程,这里我们用 setTimeout
模拟异步执行过程
function call(boolean) {
console.log('calling...')
setTimeout(() => {
if (boolean) { connected() }
else { disConnected() }
}, 3000)
}
function connected() { console.log('pick up the phone') }// 接通
function disConnected() { console.log('reject the call') }// 挂断
call(true)
这样写我们会发现函数的耦合性太高, 函数名固定死了,所以让我们改进一下
在函数声明传入的值里 多出来两个回调函数,而调用函数的同时传入成功后的回调 和 失败后的回调函数 进行解耦
function call(boolean,connectedCallback,disConnectedCallback) {
console.log('calling...')
setTimeout(() => {
if (boolean) { connectedCallback() }
else{ disConnectedCallback() }
}, 3000)
}
call(false, () => {
console.log('pick up the phone')
}, () => {
console.log('reject the call')
})
此时我们又发现了个问题,这样写后面两个参数不知道传入值是否为函数,那我们继续改进
巧用&&运算符,如果前面为真,则执行后面,如果为假,则不执行后面操作
function call(boolean,connectedCallback,disConnectedCallback) {
console.log('calling...')
setTimeout(() => {
if (boolean) { (typeof connectedCallback === 'function') && connectedCallback() }
else{ (typeof disConnectedCallback === 'function') && disConnectedCallback() }
}, 3000)
}
call(false, () => {
console.log('pick up the phone')
}, () => {
console.log('reject the call')
})
但是这样函数可读性有点差,那让我们来看看Promise
写法!
引入Promise**写法**
function call(boolean) {
return new Promise((resolve, reject) => {// new一个promise对象 对象要包裹setTimeout,不然报错找不到.then()
console.log('calling...')
setTimeout(() => {
if (boolean) { resolve() }
else{ reject() }
}, 3000)
})
}
call(false)
.then(() => {
console.log('pick up the phone')
}).catch(() => {
console.log('reject the call')
})
或者运用Async~await**写法**
function call(boolean) {
return new Promise((resolve, reject) => {
console.log('calling...')
setTimeout(() => {
if (boolean) { resolve() }
else{ reject() }
}, 3000)
})
}
(async () => {
try {
await call(true)
console.log('pick up the phone')
} catch(e) {
console.log('reject the call')
}
})()