以并行形式撰写触发器标识符的软件系统实质上而已发生改变了标识符撰写形式,精简和强化标识符的读法,使开发者以更典雅的形式撰写触发器标识符,以化解触发器标识符的业务流程掌控难题,减少了触发器程式设计技术难度。但业务流程其本质上却是触发器继续执行的,那些计划并没对业务流程这类展开强化,也没提升应用业务流程操控性。
一、Promise
1、甚么是Promise
Promise第一类代表者两个触发器操作形式,有下列3种状况。
等候(Pending):初始状况,没同时实现也没被婉拒。
同时实现(Fulfilled):操作形式已获得成功顺利完成。
被婉拒(Rejected):操作形式失利。
多于触发器操作形式的结论才能下定决心现阶段是哪一类状况,任何人其它操作形式都难以发生改变那个状况。
精简反弹冗余而已Promise的几项基本要素,Promise最关键性的是状况,Promise透过保护和传达状况的形式使反弹表达式能及时处理被初始化,这比间接传达反弹表达式要单纯和灵巧得多。
2、创建Promise第一类
let promise = new Promise((resolve, reject)=>{
//继续执行触发器操作形式标识符
if (/*获得成功*/){
resolve(value);//触发器操作形式继续执行获得成功后的反弹表达式
}else {
reject(error);//触发器操作形式继续执行失利后的反弹表达式
});
3、Promise的方法
then()
promise.then((value)=>{ //获得成功
console.log(获得成功,value);
},(error)=>{ //失利
console.err(失利,error);
})
catch()
promise.then((value)=>{
console.log(获得成功,value);
}).catch((error)=>{
console.err(失利,error);
})
Promise.resolve()
Promise.reject()
Promise.all()
var promise1= Promise.resolve(70);
var promise2= 82;
var promise3= new Promise(function(resolve){
setTimeout(resolve,1000,95);//1秒钟之后继续执行
});
Promise.all([promise1, promise2, promise3]).then(function(values){
console.log(values);
});//输出数组:[ 70,82,95]
Promise.race()
二、Generator
1、甚么是Generator
Generator是两个生成器,同时也是两个状况机,其内部拥有值和相关状况。
生成器返回一个迭代器(Iterator)第一类,能撰写业务流程透过该第一类遍历相关的值和状况,以保证正确的继续执行顺序。
Generator其本质上是两个表达式,其最大的特点是能被中断,然后再恢复继续执行。
Promise第一类创建之后,就会处于等候状况并开始继续执行,直到状况发生改变之后才能展开下一步操作形式。
Generator表达式能由用户继续执行中断,去继续执行其它操作形式,然后从中断处恢复继续执行。
2、Generator表达式声明及其继续执行
function* genFunc(score){ //声明Generator表达式声明
yield 积分+score;
yield 积分+(score +10);
return 积分+(score +20);
yield 积分+(score +30);
}
var gen = genFunc(10);//初始化之后返回了两个迭代器第一类
console.log(gen.next());//返回第一类{ value:积分10, done: false }
console.log(gen.next());//返回第一类{ value:积分20, done: false }
console.log(gen.next());//返回第一类{ value:积分30, done: false }
console.log(gen.next());//返回第一类{ value: undefined, done: true }
3、初始化Generator第一类
初始化Generator第一类有两种方法。
不断地初始化next()方法。next()方法会继续执行Generator的标识符,每次遇到yield就返回两个第一类(形式为{value: x, done: true/false}),然后“暂停”,返回的value就是yield的返回值,done表示该Generator第一类是否已经继续执行结束了。
间接用循环语句for … of自动遍历Generator第一类。
for (let obj of gen){
console.log(obj);
break;//关闭迭代器,触发return
}//最终返回:积分10
4、使用Generator化解触发器反弹难题
能将触发器操作形式写在yield语句中,在初始化next()方法后再向后继续执行。
yield除了使用表达式之外,还能使用Promise第一类。由yield对表达式求值并返回,初始化next()方法会返回两个Promise第一类,接着调用then()方法,并在反弹表达式中透过next()方法将结论传回Generator。Generator与Promise第一类联合使用,大大改进触发器标识符撰写业务流程。
三、co模块
1、co模块同时实现思路
co模块将Generator表达式包装成两个Promise第一类,作为参数传达给co()方法,在co()方法内部自动继续执行yield,以将触发器操作形式改为“顺序”继续执行。co()方法包括两个Generator表达式,co()方法在Generator表达式中使用yield指向Promise第一类,透过递归初始化next()方法将每两个Promise的值返回,从而同时实现触发器转“并行”的标识符撰写形式。
co()方法返回两个Promise第一类,能初始化then()和catch()方法对Generator表达式返回的结论展开传达,以方便后续的获得成功处理或者错误处理。
2、co模块的基本使用
要使用co模块,需要安装相应的包:
npm install co
然后在业务流程中导入该模块:
const co = require(co);
示例: co返回两个Promise第一类
co(function*(){ //声明两个co-generator表达式
var result = yield Promise.resolve(true);
return result;
}).then(function (value){
console.log(value);
}, function (err){
console.error(err.stack);
});
3、可用的yield第一类
co模块目前支持的第一类类型
Promise
Thunks(表达式)
数组(并行继续执行)
第一类(并行继续执行)
Generator(代理)
Generator表达式(代理)
第一类冗余
数组用于并行顺利完成所有的yield触发器操作形式:
co(function*(){
var res = yield [
Promise.resolve(路人甲),
Promise.resolve(路人乙),
];
console.log(res);//=>[路人甲,路人乙]
});
第一类用于并行处理:
co(function*(){
var res = yield {
男配: Promise.resolve(路人甲),
女配: Promise.resolve(路人乙),
};
console.log(res);//返回: {男配:路人甲,女配:路人乙}
});
4、co模块的错误捕获
const co = require(co);
co(function *(){
try {
yield Promise.reject(new Error(发生错误!));
} catch (err){
console.error(err.message);//”发生错误!”
}
}).catch(onerror);
function onerror(err){
//记录未捕获的错误,co模块不会抛出未处理的任何人错误,需要自己处理所有错误
console.error(err.stack);
}