1. Promise 函数的特性
- ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
- Promise 函数可以看成一个容器,里面有未来才会执行的函数,函数的参数一般也是异步执行的结果。
- Promise 函数提供了统一的语法规范,各种一步操作要求使用同样的方式处理。
- Promise 函数有三种状态:pending, resolved 和 rejected。
- Promise 函数两种状态只有两种转换路径:
pending -----> resolved
pending -----> rejected - Promise 函数的状态有两个特点:
- Promise 函数的状态不受外界的影响,只有异步操作的结果,可以决定当前是哪一种状态。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
下面是一段Demo,
var checkUserName = function(name) {
var promise = new Promise(function(resolve, reject) {
if (name == 'Spursy')
resolve('successed');
else
reject('failed');
});
return promise;
}
checkUserName('Spursy').then(
result => {
console.log(`the result is ${result}.`); // The result is successed.
}).catch(
error => {
console.log(`The error is ${error}.`);
}
);
checkUserName('YY').then(
result => {
console.log(`the result is ${result}.`);
}).catch(
error => {
console.log(`The error is ${error}.`); // The result is failed.
}
);
从上面的Demo,可以看出生成的Promise 对象的实例并不会立即执行而是需要在实例对象调用then方法时才会执行Promise实例对象内部的方法体。
2. Promise.prototype.then()
then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。
checkUserName('YY').then(function(age) {
return checkUserAge(age);
}).then(
result => {
console.log(`the result is ${result}.`);
}).catch(
error => {
console.log(`The error is ${error}.`); // The result is failed.
}
);
3. Promise.prototype.all() 与 Promise.prototype.race()
- 都是将多个Promise实例对象封装成一个实例对象。
- all() 接受的Promise对象数组必须全部resolved 后才会返回Promise 对象给then(),如果中间有一个Promise 对象不是Resolved,立刻给Then()传递rejected 的状态。
- race 接受的Promise对象数组只要有一个Promise 对象的状态发生了改变,立刻给then()传递已经改变状态的Promise对象的状态。
var p = Promise.all([p1, p2, p3])
p.then(
resolved => {}
).catch(
error => {}
)
4. Promise.resolve() 与 Promise.reject()
- 作用就是将现有的对象转换为Promise 对象
- Promise.resolve()
Promise.resolve("Spursyy")
等价于
var p = new Promise(function(resolve, reject) {
resolve("Spursyy");
})
- Promise.reject()
Promise.reject("YY");
等价于
var p = new Promise(function(resolve, reject) {
reject("YY");
})