promise中接收一个参数,这个参数是一个函数。将两个参数传递给此函数:resolve和reject。resolve是异步操作执行成功的回调函数,reject是异步操作执行失败的回调函数。被拒绝了。then方法是一个链式操作,用于分别指定成功和失败的回调函数。then方法可以接受两个参数,第一个对应resolve状态的回调,第二个对应reject状态的回调。除了then方法,Promise对象还有一个catch方法,用于指定错误发生时的回调函数。其实和then的第二个参数一样,用来指定reject的回调。区别:then的第一个函数有错误,后面的catch可以捕获到,但是写到then的第二个函数捕获不到。es6文档注释:promise表示一个异步操作,有三种状态:pending(进行中)、fulfilled(成功)和rejected(失败)。状态一旦改变,就不能再改变。pendingtofulfilled和pendingtorejected。这两种状态发生,将被称为已解决。为写作方便,本章后半部分的resolved仅指完成状态,不包括被拒绝状态。resolve和reject是JavaScript引擎提供的,不需要自己部署。constpromise=newPromise(function(resolve,reject){if(异步操作成功){resolve(value);}else{reject(error);}});resolve在异步操作成功时被调用,并将异步操作的结果作为参数传递。异步操作失败时调用reject,将异步操作报错作为参数传递。Promise实例生成后,可以使用then方法分别指定resolved状态和rejected状态的回调函数。promise.then(function(value){//成功},function(error){//失败});例如:functiontimeout(){returnnewPromise((resolve,reject)=>{setTimeout(resolve,ms,'done');})}timeout(100).then((value)=>{console.log(价值);});在上面的代码中,timeout方法返回一个Promise实例,表示发生的结果。在指定的时间(ms参数)之后,Promise实例的状态变为已解决,then方法绑定的回调函数将被触发。Promise在创建后立即执行。让promise=newPromise(function(resolve,reject){console.log('Promise');resolve();});promise.then(function(){console.log('resolved.');});console.log('Hi!');//Promise//Hi!//resolved上面代码中,Promise创建后立即执行,所以先输出Promise。然后then方法指定的回调函数要等到当前脚本的所有同步任务都执行完才会执行,所以最后输出resolved。让promise=newPromise(function(resolve,reject){console.log('Promise');reject();});promise.then(function(){console.log('resolved.');});console.log('Hi!');//Promise//嗨!使用promise实现AjaxconstgetJSON=function(url){constpromise=newPromise(function(resolve,reject){consthandler=function(){if(this.readyState!==4){return;}if(this.status===200){resolve(this.response);}else{reject(newError(this.statusText));}};constclient=newXMLHttpRequest();client.open("GET",url);client.onreadystatechange=handler;client.responseType="json";client.setRequestHeader("Accept","application/json");client.send();});returnpromise;};getJSON("/posts.json").then(function(json){console.log('Contents:'+json);},function(error){console.error('发生错误',错误);});resolve函数的参数除了正常的值外,还可能是另外一个Promise实例,比如下面这个。constp1=newPromise(function(resolve,reject){//...});then方法返回的constp2=newPromise(function(resolve,reject){//...resolve(p1);})是一个新的Promise实例(注意,不是原来的Promise实例)。所以可以采用链式写法,即在then方法之后再调用一个then方法。应用:图片加载:constpreLoadImage=function(path){returnnewPromise(function(resolve,reject){constimage=newImage();image.onload=resolve;image.onerror=reject;image.src=path;});};promise.all()我们需要从两个不同的URL获取用户的个人信息和好友列表。这两个任务可以并行执行,可以用Promise.all()来实现。promise.race()比如同时从两个url中读取用户的个人信息,只需要先拿到返回的结果即可。在这种情况下,使用Promise.race()来实现它。
