es6引入的异步编程的新解决方案:语法上是一个构造函数,用来封装异步操作并且可以获取成功或者失败的结果。
简单演示:实例化Promise
const p = new Promise();()里面参数为一个函数;而且这个函数有两个参数。resove,reject(这两个名字可以自己取)
const p = new Promise(function(resove,reject){
setTimeout(function(){
let data = ‘数据库中的用户数据’;
//异步操作(利用定时器)之后,去调用Promise内部形参的第一个
resolve(data); //表示Promise对象的状态变为成功。
let err = '数据库中的用户数据输入错误<br /> reject(err); //表示Promise对象的状态变为失败。<br /> },1000)<br />});<br />//当Promise对象的状态为成功时,可以调用p.then()方法<br />//then方法,接受两个参数,而且,两个参数都为函数。<br />p.then(function(value){ //value参数表示成功<br /> console.log(value);<br /> },<br /> function(reson){ //reson参数表示失败<br /> console.error(reson);<br /> });<br />//注意:在Promise对象里面,异步操作中,如果调用了成功函数resolve,则Promise对象的状态为成功状态,在后面调用then方法时,就会调用then方法的第一个回调<br /> 在Promise对象里面,异步操作中,如果调用了失败函数reject,则Promise对象的状态为失败状态,在后面调用then方法时,就会调用then方法的第二个回调
如下图中所示,我们再promise进行实例化的时候,对于确定promise的状态的函数中,放进去一个参数,这个参数作为状态的结果,在我们对promise实例调用then()方法的时候,在then()方法内部调用的,函数的形参可以接受上述对应的状态的结果。
改变Promise的状态有三种方法:
如下图所示:通过抛出问题,也可以实现改变Promise实例的状态(抛出错误时,状态为失败)
注意事项:
1.对于let p = new Promise() 如果p的状态由pending 变成了,resolve则p.then(value=>{console.log(value)})与p.then(value=>{alert(value)}) //这表示状态改变时,多次进行调用成功操作,但是调用的成功操作里面的不同操作,也会全部执行。
对于Promise来说指定回调和定义状态谁先谁后的问题:
如下图所示,如果在Promise实例化的时候,在里面进行异步操作时在进行状态的确定,然后再下面调用then()方法进行指定回调,那么,第一步是实例化,第二步是指定回调,第三步是定义状态。