ES6新特性之Promise

最近在学习nodeJs,看了慕课网Scott老师讲的nodeJs课程,发现老师讲的不错,清晰易懂,讲到Promise时,他用了bluebird库,但是我发现ES6的新特性里的Promise也可以,不需要引入也能用,这种控制回调函数的方法是真的救星,在jQuery中有一个$.deffered对象,说实话比较难理解,Promise的出现解救了一批前端工作者。

Promise是干嘛的

Promise是一个对象,可以从它那里获取异步操作的消息。使用了 Promise 对象之后可以用一种链式调用的方式来组织代码,让代码更加直观。

Promise三种状态

Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果才可以改变这个状态,一旦状态改变就不会再变。

resolve 和 reject

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

then && catch

then方法可以接收俩参数,分别表示resolve和reject函数返回后的回调函数。
下面是个简单的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function promiseTest(tag) {
return new Promise((resolve, reject) => {
if (tag) {
resolve("我是resolve触发的");
} else {
reject("我是reject触发的");
}
})
}

promiseTest(true).then(
(msg) => {
console.log("resolve:"+msg);// resolve:我是resolve触发的
return promiseTest(false);
},
(msg) => {
console.log("reject:"+msg);
}
).then(
(msg) => {
console.log("resolve:"+msg);
return promiseTest(false);
},
(msg) => {
console.log("reject:"+msg);// reject:我是reject触发的
}
)

catch方法用于指定发生错误时的回调函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function promiseTest(tag) {
return new Promise((resolve, reject) => {
if (tag) {
resolve("我是resolve触发的");
} else {
reject("我是reject触发的");
}
})
}

promiseTest(true).then(
(msg) => {
console.log("resolve:"+msg);
return promiseTest(false);
}
).catch(
(error) => {
console.log("error:"+error);// error:我是reject触发的
}
)

Promise.all() && Promise.race()

Promise.all()接收一个数组参数,数组中的对象都是Promise对象,作用是将数组中的所有Promise走完后,返回一个数组结果。
下面是一个小例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function promiseTest(tag) {
return new Promise((resolve, reject) => {
resolve(tag*tag);
})
}

var promiseList = [];
Array.from([1,2,3,4,5], (item) => {
promiseList.push(promiseTest(item));
})

Promise.all(promiseList).then(function(data) {
console.log(data);// [1, 4, 9, 16, 25]
})

Promise.race()接收一个数组参数,数组中的对象都是Promise对象,作用是当数组中有一个实例率先改变状态,就返回结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function promiseTest(tag) {
return new Promise((resolve, reject) => {
if (tag == 5) {
resolve(tag*tag);
}
})
}

var promiseList = [];
Array.from([1,2,3,4,5], (item) => {
promiseList.push(promiseTest(item));
})

Promise.race(promiseList).then(function(data) {
console.log(data);// 25
})
坚持原创技术分享,您的支持将鼓励我继续创作!