Generator,async/await语法糖
Generator 生成器函数,和普通函数比就是多了个*
(星号)。调用生成器函数并不会立即自行,而是会得到一个生成器对象,直到调用next()
方法。
function * fn(){
console.log("print")
const res = yield 'foo';
console.log(res);
try{
...
}catch(e){
console.log(e);
}
}
const generator = fn();
generator.next('para');
generator.throw(new Error('handle throw'));
函数体内可以添加
yield
关键字,他相当于暂停函数,直到执行next()
方法。next()
方法可以传入参数,它将作为yielf方法的返回值。函数体外执行生成器函数的
throw()
方法则是手动抛出一个异常。让生成器内部接收。一个Generator实例
function ajax(url) {
...
}function* fn() {
const res1 = yield ajax('...');
console.log(res1);
const res2 = yield ajax('...');
console.log(res2);
}const g = fn();
const result = g.next();
result.value.then(data => {
const result2 = g.next(data);
if (result2.done)
return
result2.value.then(data => {
g.next(data);
})
})
这种写法看起来会更加像同步代码,更加扁平化。调用生成器
then()
方法最好判断结果的done
属性是否为true
。为true
时已经结束,没必要再往下进行。【Generator,async/await语法糖】async/await语法糖
async/await
语法糖在使用上和generator
比更加方便,*
号替换成async
,yield
替换成await
。并且async
函数会返回一个promise
对象,更方便操作推荐阅读
- CocoaAsyncSocket|CocoaAsyncSocket (GCDAsyncSocket)适配IPv6
- AsyncTask的个人小结
- MyBatis|MyBatis Generator配置
- [JS]|[JS] generator版的阴阳谜题
- 被mybatis-generator-gui-0.6.1报错坑到的那些事(二)
- AsyncTaske简单理解
- js|js async和await的用法
- 前端|AJAX学习笔记
- 标签async、defer的区别
- 一步一步理解Generator函数的原理