ES6Generator/PromiseGeneratornode-harmonyapp.js(harmony告诉Node使用ES6运行)yield(不能在普通函数中,只能在像function*这样的Generator函数中,有next方法)的参数next方法表示前面yield语句的返回值,所以第一次使用next方法时,不能带参数。V8引擎在第一次使用next方法时直接忽略参数,从第二次使用next方法开始参数才有效。function*ticketGenerator(){yield1;产量2;产量3;//yield和return有点类似,都可以返回语句后面紧跟的表达式的值,//不同的是每次遇到yield,作用是暂停执行,next从这个位置继续往后执行time//而return没有位置记忆的功能,只能执行一次,所以一个函数只能返回一个值return4;//收益4;{value:4,done:false}}consttakeANumber=ticketGenerator();vari=0;while(i<4){i++;console.log(takeANumber.next())}//{value:1,done:false}//{value:2,done:false}//{value:3,done:false}//{value:4,done:true}//for...of依次显示yield的值,一旦next方法返回的对象的done//为true,则循环终止for(varvofticketGenerator()){console.log(v);}高级:function*foo(x){vary=2*(yield(x+1));varz=yield(y/3);返回(x+y+z);}var=foo(5);它。next()//{value:6,done:false}它。next(12)//{value:8,done:false}it.next(13)//{value:42,done:true}如果yield命令后面有遍历器,需要在后面加星号yield命令表明它返回一个迭代器。这称为yield语句。*Promise(解析异步操作的对象)pending-promise的初始状态。fulfilled-代表成功操作的promise状态。rejected-代表失败操作的promise状态。PromiselibrarybluebirdQthen.jses6-promiseypromiseeasynative-promise-onlyAPI:newPromise((resolve,reject)=>{})StaticMethods:Promise.resolve(value)--返回一个新的promise对象,它用接收到的值Promise.reject解析(value)--返回一个新的promise对象,它拒绝接收到的值。Promise.all(array)生成并返回一个新的promise对象。当这个数组中的所有promise对象都变为resolve或reject状态时,它会调用.then方法。例如:Promise.all([Promise.resolve('a'),'b',Promise.resolve('c')]).then(function(res){assert(res[0]==='a')assert(res[1]==='b')assert(res[2]==='c')})Promise.race(array)生成并返回一个新的promise对象。如果参数promise数组中的任何一个promise对象变为resolve或reject,函数就会返回,并使用promise对象的值来resolve或reject。例如:varp1=Promise.resolve(1),p2=Promise.resolve(2),p3=Promise.resolve(3);Promise.race([p1,p2,p3]).then(function(value){console.log(value);//1});原型方法:Promise.then(onFulfilled,onRejected)Promise.catch(onRejected)示例:functiontaskA(){console.log("TaskA");thrownewError("throwErrorTaskA")}functiontaskB(){console.log("TaskB");}functiononRejected(error){console.log("CatchError:",error);}functionfinalTask(){console.log("最终任务");thrownewError("throwErrorFinaltask")}varpromiseB=newPromise((resolve,reject)=>reject(newError('errormsg')))promiseB.then(成功=>console.log('onfulfilled',success),err=>console.log('onRejected',err)).then(taskA).then(taskB).catch(onRejected).then(finalTask??);//输出://onRejected错误:错误msg//TaskA//CatchError:Error:throwErrorTaskA---并没有执行taskB//FinalTaskpromiseB进入onRejectedcallback后,依旧会执行TaskA、taskA不会被onRejectedcatch捕获,会出错,taskB不会执行,直接进入onRejected->finalTask??promise链。由于onRejected和finalTask??后面没有catch处理,所以如果这两个Task中发生异常将不会被捕获,只会出现如下警告:(node:83039)UnhandledPromiseRejectionWarning:Unhandledpromiserejection(rejectionid:2):Error:抛出错误最终任务(节点:83039)弃用警告:不推荐使用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
