- 内容简介
- 译者序
- 前言
- 第 1 章 安装配置新项目
- 第 2 章 Flexbox 布局介绍
- 第 3 章 用 React Native 开发一个应用
- 第 4 章 在 React Native 中使用导航
- 第 5 章 动画和滑动菜单
- 第 6 章 用 React Native 绘制 Canvas
- 第 7 章 使用 React Native 播放音频
- 第 8 章 你的第一个自定义视图
- 第 9 章 Flux 介绍
- 第 10 章 处理复杂的应用程序状态
- 第 11 章 使用 Node 来实现服务端 API
- 第 12 章 在 React Native 中使用文件上传
- 第 13 章 理解 JavaScript Promise
- 第 14 章 fetch 简介
- 第 15 章 在 iOS 中使用 SQLite
- 第 16 章 集成 Google Admob
- 第 17 章 React Native 组件国际化
- 附录 A React.js 快速介绍
- 附录 B Objective-C Primer
- 附录 C webpack 入门
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
并行和串行——鱼和熊掌兼得
异步的思维方式并不容易接受。如果你一开始理解起来有困难,那么可以先试试写个同步的方法,就像这样:
try { var story = getJSONSync('story.json'); addHtmlToPage(story.heading); story.chapterUrls.forEach(function(chapterUrl) { var chapter = getJSONSync(chapterUrl); addHtmlToPage(chapter.html); }); addTextToPage("All done"); } catch (err) { addTextToPage("Argh, broken: " + err.message); } document.querySelector('.spinner').style.display = 'none';
它可以正常工作!但是它是同步的,这导致加载内容时会阻塞浏览器。要想让它在异步的方式下工作,需要使用“then”方法来将要做的事情一个个串联起来执行。
getJSON('story.json').then(function(story) { addHtmlToPage(story.heading); // TODO: 获取每一章节的内容并显示 }).then(function() { // 全部完成! addTextToPage("All done"); }).catch(function(err) { // 如果有错误发生就执行到这里 addTextToPage("Argh, broken: " + err.message); }).then(function() { // 总是要隐藏掉 spinner document.querySelector('.spinner').style.display = 'none'; });
但是我们该如何遍历章节内容的 URL 并依次获取内容呢?注意,下面的方法是行不通的:
story.chapterUrls.forEach(function(chapterUrl) { // 获取章节内容 getJSON(chapterUrl).then(function(chapter) { // 将章节内容添加到页面上 addHtmlToPage(chapter.html); }); });
“forEach”并不会对异步操作做特殊处理,此时我们页面上章节内容显示的顺序是它们加载完成的顺序,所以必须要解决显示顺序的问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论