今天整理项目回忆起项目中用到Promise,然后结合廖雪峰老师的网站(廖雪峰老师的网站),又重新学习下Promise,然后整理下,分享给大家。
下面是整理廖老师的例子代码
//定义Promise对象的函数
function promiseFun(){
return new Promise((resolve,reject) => {
var timeOut = Math.random() * 2;
console.log('set timeout to: ' + timeOut + ' seconds.');
//这里可以是ajax异步请求
setTimeout(function () {
if (timeOut < 1) {
console.log('call resolve()...');
//正确返回
resolve('200 OK');
}else {
console.log('call reject()...');
//错误返回
reject('timeout in ' + timeOut + ' seconds.');
}
}, timeOut * 1000);
})
}
下面是调用Promise对象的函数的方法
promiseFun().then(res=>{
//异步请求返回正确执行代码
console.log(res)
}).catch(res1=>{
//异步请求返回错误执行代码
console.log(res1)
})
还有两种用法是廖老师的例子,可以照着例子试一下,我的项目没有用到这种方法。
除了串行执行若干异步任务外,Promise还可以并行执行异步任务。
试想一个页面聊天系统,我们需要从两个不同的URL分别获得用户的个人信息和好友列表,这两个任务是可以并行执行的,用Promise.all()实现如下:
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
console.log(results); // 获得一个Array: ['P1', 'P2']
});
有些时候,多个异步任务是为了容错。比如,同时向两个URL读取用户的个人信息,只需要获得先返回的结果即可。这种情况下,用Promise.race()实现:
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
console.log(result); // 'P1'
});
由于p1执行较快,Promise的then()将获得结果’P1’。p2仍在继续执行,但执行结果将被丢弃。
希望大家点点关注呀!