Promise
1.什么是Promise
Promise是异步编程的一种解决方案。
Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。(MDN)
Promise在设计上具有原子性,即只有三种状态:等待(Pending)、成功(Fulfilled)、失败(Rejected)。这让我们在调用Promise的异步方法时,逻辑变得非常简单,这在大规模的软件工程开发中具有良好的健壮性。(实战es2015)
2.基本语法
创建 Promise对象
new Promise( function(resolve, reject) {...} /* executor */ );
executor是带有 resolve 和 reject 两个参数的函数 。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。
如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略。
进行异步操作
- resolve(value) 方法控制的是Promise对象是否进入成功状态,一旦执行该方法并传入有且只有一个的返回值,Promise 便会从等待状态进入成功状态,Promise也不会再接收任何状态的改变。
- reject(reason) 方法控制的是Promise对象是否进入失败阶段,一旦进入失败状态就无法再改变。
- 一旦出现throw 语句,Promise对象便还会直接进入失败状态,并以throw语句的抛出值作为错误值进行错误处理。
let myFirstPromise = new Promise(function(resolve, reject){
//当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)
//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.
setTimeout(function(){
resolve("成功!"); //代码正常执行!
}, 250);
});
myFirstPromise.then(function(successMessage){
//successMessage的值是上面调用resolve(...)方法传入的值.
//successMessage参数不一定非要是字符串类型,这里只是举个例子
console.log("Yay! " + successMessage);
});
3.方法
Promise.all(iterable)
返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
}).catch(err=>err);
Promise.race(iterable)
返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promis就会解决或拒绝。
var promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, 'one');
});
var promise2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then(function(value) {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"