promise介绍

基本用法:

1
2
3
4
5
6
7
8
9
var promise = new Promise((resolve, reject) => {
console.log('立即执行');
var result = 2+1;
if(result>2){
resolve(result);
}else{
reject(result);
}
});

1
2
3
4
5
6
7
8
9
10
11
12
13
// 写法一
promise.then(value=>{
console.log('resolve:'+value);
}, e=>{
console.log('reject:'+e);
});
// 写法二
promise.then(value=>{
console.log('resolve:'+value);
}).catch(e=>{
console.log('reject:'+e)
});

两种写法的不同在于

1
2
3
4
5
6
7
8
9
10
11
12
13
promise.then(value=>{
throw new Error('div 0');
console.log('resolve:'+value);
}, e=>{ // 捕获不到resovle中的异常
console.log('reject:'+e);
});
promise.then(value=>{
throw new Error('div 0');
console.log('resolve:'+value);
}).catch(e=>{// 可以捕获到resolve中的异常
console.log('reject:'+e)
});

异步取消的promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const makeCancelable = (promise) => {
let hasCanceled = false;
const wrappedPromise = new Promise((resolve, reject) => {
promise.then((val) => {
const x = hasCanceled ? reject({ isCanceled: true }) : resolve(val);
return x;
}).catch((error) => {
const x = hasCanceled ? reject({ isCanceled: true }) : reject(error);
return x;
});
});
return {
promise: wrappedPromise,
cancel() {
hasCanceled = true;
},
};
};