《AngularJS高级程序设计》——5.9 使用承诺

5.9 使用承诺

承诺是一种表述方式,它表明某项工作会以异步方式执行并在未来某个点被完成。最常遇到的方式是产生Ajax请求,当请求被完成时,浏览器会暗地里发出HTTP请求通知你的应用程序。在清单5-42中,我创建了产生Ajax请求的袖珍AngularJS应用程序。

注意:
该示例依赖于我在章节伊始创建的todo.json文件。
清单5-42 在文件jsdemo.html中创建袖珍AngularJS应用程序

我在该清单中所使用的AngularJS特性是在第2章中所熟知的。我创建了AngularJS模块并给了它控制器demoCtrl。控制器使用$scope对象为视图提供数据,该视图有使用数据绑定和ng-repeat指令的表格。你可以在图5-3中看到浏览器是如何显示该示例的。

JavaScript及异步编程

如果你是从像C#或Java语言来到JavaScript的,你可能会惊讶于缺失控制异步代码执行的关键字,诸如lock或synchronized之类的。JavaScript不支持这种流控制或提供对设置优先级的支持。这致使了更简单的开发者体验,即使它很容易不小心产生副作用。我将在第20章中讲AngularJS对创建自定义承诺的支持时回到这一话题。
模块、控制器和视图就是全部我向你展示承诺如何工作所需设置的设施了。清单的重要部分在这:

$http服务(我在第20章讲它)用于产生Ajax请求,然后get方法取到你想从服务器获取的文件的URL。(仅通过指定文件名,我就能告诉浏览器我想要的文件在当前所显示的HTML文档旁边的哪里。)

Ajax请求是被异步执行的,当请求发出时,浏览器继续运行我的简单应用程序。$http.get方法返回承诺对象,我可以用它接收关于Ajax请求的通知。在本例中,我使用success方法注册了将在请求完成后被调用的回调函数。该回调函数接收从服务器拿到的数据,我使用它把属性赋值给$scope,接着依次给出ng-repeat指令的内容填充to-do项的表格。Success方法是承诺对象所定义的三个中的一个,如表5-7所示。

表5-7 承诺对象定义的方法

三个方法都用函数作为参数,并根据承诺的结果而调用。回调函数success会被传入从服务器拿到的数据,而回调函数error接收遭遇到问题的详情。

提示:
另一个方式是考虑承诺所定义的方法是类似于事件的。在这种方式中在用户单击按钮并触发事件时回调函数会被调用,承诺将在工作被完成时调用回调函数。
三个承诺方法都返回承诺对象,让异步任务可以按顺序链接在一起。清单5-43包含简单示例。

清单5-43 在文件jsdemo.html中链接承诺

这里我使用了then方法两次,第一次是处理调用$http.get方法的响应,并再次注册稍后将被调用的函数。这种类型的代码很难读,所以我会使用依序高亮显示。第一,我调用get方法创建Ajax请求:

我使用then方法提供函数,它在Ajax请求完成时将被调用。第一个在请求成功时调用,而第二个在请求失败时:

承诺保证那些函数中的一个将被调用,但不是直到Ajax请求被完成或失败才调用。我使用then方法再次添加了额外的函数:

这一次我仅仅为then方法传入一个函数,意味着如果有问题我也不想要通知。这最后的函数不顾之前被调用过的函数,向数据模型添加了一项。你可以在图5-4中看到Ajax请求成功的效果。

提示:
如果暂时链接的不太好也不用担心。当你开始在你自己的项目中使用承诺时你将很快有主意,你会在第20章中(在我讲AngularJS对Ajax的支持时)以及第21章中(在我讲RESTful的Web服务时)看到更多的承诺示例。

时间: 2024-08-17 21:46:00

《AngularJS高级程序设计》——5.9 使用承诺的相关文章

《AngularJS高级程序设计》——导读

前言 AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中,并且得到众多前端工程师的青睐. 本书是AngularJS程序设计的高级指南.全书共25章,分为3个部分,每部分覆盖一组相关话题.第1部分为第1章到第8章,包括AngularJS简介,以及HTML.CSS和JavaScript的基础知识.第2部分为第9章到第17章,引导读者熟悉AngularJS库的各种特性,从对一个AngularJS应用程序中各种不同组件的概览开始,依次深入介绍每种类型的组件.第3部分为第18

《AngularJS高级程序设计》——2.3 基本功能之外

2.3 基本功能之外 我定义了基本的MVC构件,这样,就创建了一个本章开始时的静态模拟程序的动态版本.现在我们已经有了一个较为坚固的基础了,就可以使用一些更高级的技术来增添功能并创建一个更为完整的应用.在下面各节中,我将对这个待办事项应用使用不同的AngularJS特性,并解释将在本书中的何处更详细地介绍这些特性. 2.3.1 使用双向模型绑定 在前一节中所使用的绑定被称为单向绑定,其值是从模型中取得的,并用于操作模板中的元素.在Web应用开发中这是相当标准的做法和广泛应用的技术.例如,在使用j

《AngularJS高级程序设计》——第5章 JavaScript基础 5.1准备示例项目

第5章 JavaScript基础 在本章中,我提供了JavaScript语言最重要特性的快速指南,它们适用于本书.我没有余力完整地讲解JavaScript,但我会专注其本质,即你需要快速了解情况并随着本书的示例走.除了最重要的JavaScript语言核心特性外,我还会讲述AngularJS提供的工具方法集. 通过演示JavaScript如何使用承诺,我完成了这一章.承诺代表异步任务,比如Ajax请求,而且它们在AngularJS应用中是广泛使用的,我在第21章会再谈这一话题.我还讲到Angula

《AngularJS高级程序设计》——5.11 小结

5.11 小结 在本章中我提供了JavaScript语言的简单基础,以及AngularJS为补充核心语言特性而提供的实用方法.我还介绍了承诺以及AngularJS对JSON的支持,它们二者是使用Ajax并实现我在第3章中讲的单页面应用程序模型所必不可少的.我不能在本书中提供完整的JavaScript描述,但我在这讲述的特性是我在本书中的示例所最常使用的,并且应该足够你跟上我对AngularJS开发不同方面的讲解.

《AngularJS高级程序设计》——5.10 使用JSON

5.10 使用JSON JavaScript对象符号(JSON)已经成了名副其实的Web应用数据格式.在JavaScript代码中使用JSON是简单且容易的,这就是为什么它已经变得如此流行.JSON支持一些基本的数据类型,与JavaScript巧妙地结合在了一起:Number.String.Boolean.Array.Object和特殊类型null. 在此提醒,这是todo.json文件的内容,它包括简单的JSON字符串: JSON数据看起来和JavaScript用来声明数组和对象的字面量类似.

《AngularJS高级程序设计》——5.5 使用变量及类型

5.5 使用变量及类型 在前面的例子中你看到了如何定义变量:你用var关键字,然后可选地在语句中为变量赋值.在函数中定义的变量是本地变量,适合仅在函数内使用.直接定义在script元素中的变量是全局变量,可在任意位置访问,包括同一HTML文档中的其他脚本.清单5-8演示了本地和全局变量的使用. 清单5-8 在文件jsdemo.html中使用本地和全局变量 JavaScript是动态类型语言.这并不说明JavaScript没有类型.它只是说你并非一定要显式声明变量类型,你可以轻而易举地为同一变量赋

《AngularJS高级程序设计》——5.4 定义并使用函数

5.4 定义并使用函数 当浏览器处理HTML文档时,它会一个挨一个地往下读.当其遇到script元素,就立刻按其定义顺序执行所包含的JavaScript语句. 这就是前面的例子中发生的,向控制台写了两条消息.你也可以将多条语句包成函数,在浏览器遇到调用该函数的语句前它不会执行,如清单5-4所示. 清单5-4 在文件jsdemo.html中定义JavaScript函数 定义函数很简单:使用function关键字,后面跟着你想的函数名,然后是一对括号("("和")").

《AngularJS高级程序设计》——5.8 比较undefined和null值

5.8 比较undefined和null值 JavaScript定义了两个特别的值,当你比较它们时你得小心:undefined和null.当你读取没有赋值的变量或试图取不存在的对象属性时会返回undefined.清单5-38展示了JavaScript中undefined是如何使用的. 清单5-38 在文件jsdemo.html中的特殊值undefined 该清单输出如下: JavaScript还定义了另一个特殊值null,这很少见.Null值与undefined稍有不同.当值没有被定义时返回un

《AngularJS高级程序设计》——1.5 如何搭建你的开发环境

1.5 如何搭建你的开发环境 从一个浏览器.一个文本编辑器和一个Web服务器就可以开始你的AngularJS开发之旅.客户端Web应用开发的好处之一就是你可以挑选并组合一系列开发工具,以创建一个适合你工作风格和编程实践的环境.在下面的各节中,我将描述我所使用的环境,以便你可以在自己的工作站上重新创建它.1.5.1 选择Web浏览器 AngularJS在任何现代浏览器上都可以工作,你应该在你的用户有可能使用到的所有浏览器上测试你的应用.不管怎样,你需要一个为开发而用的浏览器,以便于搭建出开发环境,