简单理解ES6Promise前言Promise是一种异步编程的解决方案:从语法上讲,promise是一个对象,可以从中获取异步操作的消息;它会给你一个结果。Promise可以确保异步请求顺序执行。概念:Promise是ES6中的一种新语法,它本身就是一个构造函数;每个新的Promise实例对象代表一个异步操作Function:解决回调地狱问题(即异步嵌套调用问题)回调地狱:指回调函数中嵌套回调函数的代码形式;如果嵌套层次很深,就是回调地狱;回调地狱不利于代码阅读、维护以及后面如何使用扩展的Promise来创建具体的异步操作对象constp=newPromise(function(successCb,errorCb){//在这个函数中定义具体的异步操作//successCbsuccesscallback//errorCbfailurecallback})Promiseisconstructor可以是一个新的对象,本身就是一个异步操作PromisethenmethodPromise有两个方法参数,successCb和errorCb,分别代表执行成功或者失败。Promise对象可以通过then方法调用successCb和errorCb。具体有两种情况如下:result.then(function(data){/*成功回调*/},function(data){/*失败回调*/})result.then(function(){/*成功回调*/})。catch(function(data){/*failurecallback*/})前者在then方法中分别通过两个参数接受successCb和errorCb回调函数后者通过then和catch两个方法依次接受successCb和errorCb回调函数示例://引入fs模块constfs=require('fs')//4)Promise介入和丰富操作(添加成功、失败回调)functiongetFileCont(filename){//实例化一个Promise对象,表明它是异步的operation//newPromise(function(successCbfunction,errorCbfunction){})//successCb:当前异步操作成功时触发Executeresolve//errorCb:当当前异步操作出现错误(意外)时,会触发reject的执行returnnewPromise(function(successCb,errorCb){//体现了异步流程fs.readFile(filename,'utf8',function(err,data){if(err){returnerrorCb('读取文件时出错:'+err)}//当所有操作都ok时正常处理,将处理后的结果交给resolvecall(return)successCb(data)})})}//下面可以保证按顺序得到结果getFileCont('./files/1.txt').then(function(result){console.log(结果)返回getFileCont('./files/2.txt')}).then(函数(结果){console.log(result)返回getFileCont('./files/3.txt')}).then(函数(result){console.log(result)}).catch(function(err){console.log(err)})ES7的asyncandawaitES7的asyncandawait可以简化Promise调用,提高Promise代码的可读性和理解性。async和await的结合可以让异步调用不返回Promise,而是直接返回then参数方法的参数(也是successCb函数的实参),让代码更加节俭,提高代码开发效率,并且也可以保证异步调用的顺序,执行async和await。情况:注意:async和await必须同时出现。一个async可以对应多个await。await修改的结果必须是一个Promise对象varobj={asyncgetInfo(){awaitgetXXXX()awaitgetXXXX()}}或者functionffff(){//async需要设置到最近的outer前面Promise对象的功能getInfo(asyncfunction(){awaitgetXXXX()//console.log(getXXXX())})}或者asyncfunctionXXXX(){awaitgetXXXX()}总结newPromise()实例化对象,参数回调函数会存在两个回调successCb和errorCb参数可以通过then和catch()接收,但是异步调用代码的程度还是有hellcallbacks的,体现了async和await的结合,直接将返回的Promise转化为实际的successCb的参数。大大简化了代码开发的复杂度,提高了开发效率。必要时使用try/catch捕获async和await。async、await和exception的组合提供了异步顺序执行的解决方案。异步函数getThreeFile(){try{console.log(awaitgetFileCont('./files/1.txt'))console.log(awaitgetFileCont('./files/2.txt'))console.log(awaitgetFileCont('./files/3.txt'))}catch(err){console.log(err)}}getThreeFile()
