2015年6月,ECMAScript6正式版终于发布。ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的一种实现。ES6的目标是让JavaScript语言能够用来编写大型复杂的应用程序,成为企业级的开发语言。ConceptES6原生提供了Promise对象。所谓Promise,就是用来传递异步操作消息的对象。它代表一个事件,其结果在未来是不可知的(通常是异步操作),这个事件提供了一个统一的API来进行进一步的处理。Promise对象有以下两个特点。(1)物体的状态不受外界影响。Promise对象表示一个异步操作,有三种状态:Pending(进行中)、Resolved(完成,也称为Fulfilled)和Rejected(失败)。只有异步操作的结果才能确定当前处于哪个状态,其他任何操作都不能改变这个状态。这也是Promise这个名字的由来,英文是“承诺”的意思,意思是不能通过其他方式改变。(2)状态一旦改变,就不会再改变,随时可以得到这个结果。改变Promise对象的状态只有两种可能性:从Pending到Resolved和从Pending到Rejected。只要这两种情况发生,状态就会冻结,不会再发生变化,这个结果就会一直保持下去。即使变化已经发生,如果你给Promise对象添加一个回调函数,你也会立即得到这个结果。这与事件(Event)完全不同。事件的特点是错过了再听,就得不到结果。有了Promise对象,异步操作就可以表达在同步操作的过程中,避免了层层嵌套的回调函数。此外,Promise对象提供了统一的接口,更容易控制异步操作??。Promises也有一些缺点。首先,Promise是不能取消的,一旦创建,就会立即执行,不能中途取消。其次,如果没有设置回调函数,Promise内部抛出的错误不会反映到外部。第三,当它处于Pending状态时,无法得知当前正在进行到哪个阶段(刚刚开始还是即将完成)。varpromise=newPromise(function(resolve,reject){if(/*异步操作成功*/){resolve(value);}else{reject(error);}});promise.then(function(value){//成功},函数(值){//失败});Promise构造函数接受一个函数作为参数,函数的两个参数是resolve方法和reject方法。如果异步操作成功,使用resolve方法将Promise对象的状态从“未完成”变为“成功”(即从pending变为resolved);如果异步操作失败,使用reject方法将Promise对象的状态从“NotCompleted”变为“Failed”(即从pending变为rejected)。基本apiPromise.resolve()Promise.reject()Promise.prototype.then()Promise.prototype.catch()Promise.all()//全部完成varp=Promise.all([p1,p2,p3]);Promise.race()//Race,complete可以提前promises的神奇之处在于给我们前面的return和throw,每个Promise都会提供一个then()函数,和一个catch(),其实就是then(null,...)函数,somePromise().then(functoin(){//dosomething});我们可以做三件事,返回另一个promise返回一个同步值(或undefined)抛出一个同步异常`thrownewEror('');`1.封装同步和异步代码newPromise(function(resolve,reject){resolve(someValue);});写成Promise.resolve(someValue);2。捕获同步异常newPromise(function(resolve,reject){thrownewError('悲剧,又出bug了');}).catch(function(err){console.log(err);});如果是同步代码,可以写成Promise.reject(newError("Whatthehell"));3.多重异常捕获,更精准捕获function(e){//Willenduphereifawasn'tdefinedatall}).catch(function(e){//Genericcatch-therest,errorwasn'tTypeErrornor//ReferenceError});4.获取两个Promise的返回值。then方法依次调用并设置更高级别的作用域spread5。finally无论如何都会被Executed,一般写在catch#p#6之后。bindsomethingAsync().bind({}).spread(function(aValue,bValue){this.aValue=aValue;this.bValue=bValue;returnssomethingElseAsync(aValue,bValue);}).then(function(cValue){returnthis.aValue+this.bValue+cValue;});或者你也可以这样做,bValue);}).then(函数(cValue){returnscope.aValue+scope.bValue+cValue;});但是还是有不少区别的,首先要声明有浪费资源和内存泄漏的风险,不能用在表达式的上下文中效率较低7.all对于处理一个动态大小的非常有用承诺清单8.加入。非常适合处理多个分离的Promisevarjoin=Promise.join;join(getPictures(),getComments(),getTweets(),function(pictures,comments,tweets){console.log("intotal:"+pictures.length+comments.length+tweets.length);});9.道具。处理承诺的地图集合。如果只有一个失败,则所有执行结束图片、result.comments);});10.任何,一些,racePromise.some([ping("ns1.example.com"),ping("ns2.example.com"),ping("ns3.example.com"),ping("ns4.example.com")],2).spread(function(first,second){console.log(first,second);}).catch(AggregateError,function(err){err.forEach(function(e){console.error(e.stack);});});;有可能有很多失败的承诺,因此,Promsie将永远不会实现11。.map(Functionmapper[,Objectoptions])用于处理数组,或者promises数组,Option:concurrencyandfindmap(...,{concurrency:1});下面是无限并发,读取文件信息varPromise=require("bluebird");varjoin=Promise.join;varfs=Promise.promisifyAll(require("fs"));varconcurrency=parseFloat(process.argv[2]||"Infinity");varfileNames=["file1.json","file2.json"];承诺。地图(文件名,函数(文件名){returnfs.readFileAsync(fileName).then(JSON.parse).catch(SyntaxError,function(e){e.fileName=fileName;throwe;})},{concurrency:concurrency}).then(function(parsedJSONs){控制台.log(parsedJSONs);}).catch(SyntaxError,function(e){console.log("InvalidJSONinfile"+e.fileName+":"+e.message);});结果$sync&&echo3>/proc/sys/vm/drop_caches$nodetest.js1readingfiles35ms$sync&&echo3>/proc/sys/vm/drop_caches$nodetest.jsInfinityreadingfiles:9ms12。.reduce(Functionreducer[,dynamicinitialValue])->PromisePromise.reduce(["file1.txt","file2.txt","file3.txt"],function(total,fileName){returnfs.readFileAsync(fileName,"utf8").then(function(contents){returntotal+parseInt(contents,10);});},0).then(function(total){//Totalis30});13.Time.delay(intms)->Promise.timeout(intms[,Stringmessage])->PromisePromise的现实qbluebirdcowhen
