声明一个Promise对象
// 方法1
let promise = new Promise ( (resolve, reject) => {
if ( success ) {
resolve(a) // pending ——> resolved 参数将传递给对应的回调方法
} else {
reject(err) // pending ——> rejectd
}
} )
//或方法2
function promise () {
return new Promise ( function (resolve, reject) {
if ( success ) {
resolve(a)
} else {
reject(err)
}
} )
}
Promise.prototype.then() 和 Promise.prototype.catch()
then()方法使Promise原型链上的方法,它包含两个参数方法,分别是已成功resolved的回调和已失败rejected的回调
promise.then(
() => { console.log('成功的回调') },
() => { console.log('出错的回调') }
)
.catch()的作用是捕获Promise的错误,与then()的rejected回调作用几乎一致。但是由于Promise的抛错具有冒泡性质,能够不断传递,这样就能够在下一个catch()中统一处理这些错误。同时catch()也能够捕获then()中抛出的错误,所以建议不要使用then()的rejected回调,而是统一使用catch()来处理错误。
下面看一个例子
function runAsync1() {
return new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function (str) {
console.log(str + '执行完成');
resolve()
}, 1000, '异步任务1');
})
}
function runAsync2() {
return new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function (str) {
console.log(str + '执行完成');
//下面2句只会执行一句,谁先谁执行
reject('异步任务2')
resolve()
}, 1000, '异步任务2');
})
}
function runAsync3() {
return new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function (str) {
console.log(str + '执行完成');
}, 1000, '异步任务3');
})
}
runAsync1()
.then(function (res) {
return runAsync2()
},function (reason) {
console.log(reason,'捕捉出错1')
})
.then(function (res) {
return runAsync3()
},function (reason) {
console.log(reason,'捕捉出错2')
})
.catch(function (reason) {
console.log(reason,'最后捕捉出错')
})
看看打印的结果就知道Promise链式写法的好处了。
特别是在处理第三方登录,比如获取微信登录信息的时候,需要好几个流程的异步处理。
网友评论