首先,promise是一个构造函数。要使用它,必须通过new创建一个实例,新实例有一个内置参数,就是一个函数。这个参数有两个内置参数,resolve和reject,而这两个参数也是两个函数varpromise=newPromise(function(resolve,reject){//...somecodeif(/*asyncoperationsucceeded*/){resolve(value);}else{reject(error);}.then(function(){},function(){})*以上是最简单的promise对象vara=newPromise(function(resolve,reject){console.log("A");resolve();console.log("B")}).then(function(){console.log("C")})//A//??B//Cvarb=newPromise(function(resolve,reject){varsuccess="success";varerr="err";reject(err)}).then(function(e){console.log(e)},function(e){console.log(e)})//errthen属于promise的一个方法,then中的两个参数属于promise状态到达后调用的回调函数,当promise状态成功时,调用第一个函数,失败时调用第二个函数,同时我们可以看到promise实例创建的那一刻,它的实参函数就开始执行了。当resolve函数执行时,promise对象的状态从执行中变为执行成功。同样,reject函数的执行将promise状态从另外resolve和reject也起到传递信息的作用。通过它们的参数传递信息,then方法可以接收传递的信息。Promise的一些属性和方法可以通过Promise.prototype获取。注意:Promise的首字母一定要大写。当然then方法可以使用连锁反应,即当then方法的参数(回调函数)执行后返回一个promise实例时,后续的then会继续等待实例的最终状态并进行回调varb=newPromise(function(resolve,reject){vara=function(){returnnewPromise(function(resolve,reject){varc=1;resolve(c)})};reject(a)}).然后(function(e){console.log(e)},function(e){vard=e();returnd}).then(function(e){console.log(e)},function(e){console.log(e)})//1Promise的catch方法是当上述程序出现错误时,指定要执行的回调函数。回调函数有一个参数err,用于存储捕获到的错误vara=function(){returnnewPromise(function(resolve,reject){resolve(x+3)//xisnotdeclared}).catch(function(err){console.log(err)}).then(function(){console.log("success")},function(){console.log("err")})};a()//输出x未定义vara=function(){returnnewPromise(function(resolve,reject){resolve(x+3)}).then(function(){console.log("success")},function(){console.log("err")})};a()//输出错误vara=function(){returnnewPromise(function(resolve,reject){reject(x+3)}).then(function(){console.log("success")},function(){console.log("err")})};a()//第一个例子中当调用reslove时输出err当出现错误时,catch捕获错误并执行回调函数。catch后面的then方法成为catch结果的回调。由于错误捕获成功,所以调用then的第一个回调函数。从例子2中,我们比较可以看出,promise状态的成功需要resolve函数执行成功才能判断promise状态的成功。如果resolve函数没有执行成功,promise状态立马变为rejectfailure,调用then后的第二个函数从例子3可以看出,如果promise中的状态为失败,就会调用rejectvara=function(){returnnewPromise(function(resolve,reject){console.log(1)}).then(function(){console.log("success")},function(){console.log("err")})};a()//1从上面的例子我们可以看出,当没有为promise指定状态时,则方法不会被激活vara=function(){returnnewPromise(function(resolve,reject){resolve();拒绝();}).then(function(){console.log("success")},function(){console.log("err")})};a()//success在上面的例子中,我们可以看到,一旦有一个状态就被指定了,是不能改变的。
