1.Ajax 是典型的异步操作,通过 Generator 函数部署 Ajax 操作,可以用同步的方式表达

function* main() {
var result = yield request("http://some.url");
var resp = JSON.parse(result);
console.log(resp.value);
} function request(url) {
makeAjaxCall(url, function(response){
it.next(response);
});
} var it = main();
it.next();

上面代码的main函数,就是通过 Ajax 操作获取数据。可以看到,除了多了一个yield,它几乎与同步操作的写法完全一样。注意,makeAjaxCall函数中的next方法,必须加上response参数,因为yield表达式,本身是没有值的,总是等于undefined

2.Generator 函数的一个重要实际意义就是用来处理异步操作,改写回调函数

function* loadUI() {
showLoadingScreen();
yield loadUIDataAsynchronously();
hideLoadingScreen();
}
var loader = loadUI();
// 加载UI
loader.next() // 卸载UI
loader.next()

上面代码中,第一次调用loadUI函数时,该函数不会执行,仅返回一个遍历器。下一次对该遍历器调用next方法,则会显示Loading界面(showLoadingScreen),并且异步加载数据(loadUIDataAsynchronously)。等到数据加载完成,再一次使用next方法,则会隐藏Loading界面。可以看到,这种写法的好处是所有Loading界面的逻辑,都被封装在一个函数,按部就班非常清晰。

3.利用 Generator 函数,可以在任意对象上部署 Iterator 接口

function* iterEntries(obj) {
let keys = Object.keys(obj);
for (let i=0; i < keys.length; i++) {
let key = keys[i];
yield [key, obj[key]];
}
} let myObj = { foo: 3, bar: 7 }; for (let [key, value] of iterEntries(myObj)) {
console.log(key, value);
} // foo 3
// bar 7

备注:文中多数内容摘自阮一峰老师文章,仅供自我学习查阅。

最新文章

  1. 【四】搭建Markdown的编辑器
  2. Android应用内存泄漏的定位、分析与解决策略
  3. String.Format格式说明——复制于DotNet笔记
  4. hadoop 分布式缓存
  5. URAL 2080 莫队
  6. W3cshool之JavaScript基础
  7. Android更新UI的两种方法——handler与runOnUiThread()
  8. (转载)python多行注释
  9. Swift中的延迟加载(懒加载)
  10. C/C++中的const int*和int * const
  11. django note
  12. 以太坊MetaMask钱包插件简介
  13. 20160214.CCPP体系详解(0024天)
  14. 一个字符带下滑线的EditText
  15. [ffmpeg] 滤波
  16. CAN总线相关的几个gitlab代码
  17. 启明星系统安装教程(如何在windows2012里配置IIS)
  18. 移动端动态font-size
  19. leetcode1004
  20. bzoj1242(弦图判定)

热门文章

  1. Keras函数——mode.fit_generator()
  2. kubelet源码分析——关闭Pod
  3. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用
  4. 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
  5. 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?
  6. 新手小白在github上部署一个项目
  7. 第五课第四周笔记4:Transformer Network变压器网络
  8. python的虚拟环境Anaconda使用
  9. Java:创建对象小记
  10. 大闸蟹的 O O 第三单元日子——中测与强测的惨烈修罗场