Promise-"承诺"
描述单个程序的执行状态:
同步:阻塞,当前程序要执行,必须等前面的程序执行完毕以后才能执行。
异步:非阻塞,当前程序的执行,和前面的程序是否执行完毕没有关系。
描述多个程序之间的运行关系:
并行:A,B,C可以同时运行。
串行:必须是A执行完毕,再去执行B,B执行完毕以后,再去执行C。
如何让异步程序进行串行。
启动延时器:
1、先去启动一个1秒延时器
2、当1秒定时器到了以后,启动一个2秒的延时器
3、当2秒定时器到了以后,启动一个3秒的延时器
console.log("启动一个1秒的延时器");
setTimeout(function(){
console.log("1秒延时器到了");
console.log("启动一个2秒的延时器");
setTimeout(function(){
console.log("2秒延时器到了");
console.log("启动一个3秒的延时器");
setTimeout(function(){
console.log("3秒延时器到了");
}, 5000);
}, 3000);
}, 4000);
上面这是我们传统的异步函数解决方式因为是异步 它不会按照我们所写的顺序执行,所以只能通过层层嵌套关系使异步程序按顺序执行,但是这样执行异步程序有两个缺点:1、回调地狱(嵌套太多层) 2、结构非常的紊乱
下面我们就来了解一下针对异步编程的解决方法Promise
Promise 是ES6对异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。Promise 简单说就是一个容器,里面保存着一个尚未完成且预计在未来完成的异步操作
Promise 是一个构造函数,用来创建一个Promise对象。
Promise对象代表一个异步操作,有两种种状态:
resolve(成功) reject(失败)
一旦状态改变,就不会再变,任何时候都可以得到这个结果。有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
下面我写一个简单的获取随机数验证成功还是失败的Promise验证操作并且两秒钟后出结果:
var p = new Promise(function(resolve,reject){//这里是同步
setTimeout(function(){
var num = Math.floor(Math.random()*15);
if(num>7){
resolve('成功');
}else{
reject('失败');
}
},2000);
}).then(function(msg){//创建Promise对象(then是异步)
console.log(msg);//成功
},function(msg){
console.log(msg)//失败
});
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。
resolve 和 reject 是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve 函数的作用是,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。
reject 函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise实例的then方法:第一个参数是resolved状态的回调函数第二个参数(可选)是rejected状态的回调函数方法返回的是一个新的Promise实例
【注】一个promise对象后面只能跟一个.then方法。
【注】超过两个异步程序串行的写法,如下代码:
function getPromise(msg,time){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve(msg);
},time);
});
}
getPromise('执行1秒延时器',1000)
.then(function(msg){
console.log(msg);
return getPromise('执行2秒延时器',2000);
})
.then(function(msg){
console.log(msg);
return getPromise('执行3秒延时器',3000);
})
.then(function(msg){
console.log(msg);
})
Promise实例的catch方法:用于指定发生错误时的回调函数,看如下代码:
var state = 0;
new Promise(function(resolve, reject){
if(state == 1){
resolve("代码执行成功1");
}else{
reject("代码执行失败1");
}
}).catch(function(msg){
console.log("catch," + msg);
})
Promise.all可以将多个Promise实例包装成一个新的Promise实例。1.它接受一个数组作为参数。2.数组可以是Promise对象,也可以是其它值,只有Promise会等待状态改变。3.当所有的子Promise都完成,该Promise完成,返回值是全部值的数组。4.如果有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果,以下是操作方法:
Promise.all([p1,p2,p3]).then(function (arr){
console.log(arr);
},function (error){
console.log(error);
});
最后祝大家都能轻松学好这项技术!逆战加油!中国加油!!!