我们可以先来看一下 $q 这个服务提供的一些东西。在这个 app.js 里面,定义已经好了一个空白的控制器,UserController,还有一个空白的服务 ... GithubService ,我们假设这个服务提供了一些跟 Github 相关的功能,比如使用 Github 的帐户登录的功能。
myApp.controller('UserController', function () {
});
myApp.factory('GitHubService', function () {
});
在这个服务里面,我们可以先注入 $q 这个服务 ... 另外还有 $log 这个服务 ,它可以在控制台上输出一些东西。在这个服务里定义一个方法,比如叫做 _login ... 然后在返回这个方法,这样我们就可以在别的地方使用服务里定义的这个 _login 方法了。
myApp.factory('GitHubService', function ($q, $log) {
var _login = function () {
};
return {
login: _login
};
});
在这个方法里,先用一下 $q 服务的 defer() 这个方法,去创建一下Deferred 对象 ... 然后在控制台上输出这个对象 ...
var defer = $q.defer();
$log.log(defer);
在看一下 UserController 这个控制器,我们可以在这个控制器里使用 GitHubService 这个服务 ... 把它注入进来 ... 然后可以直接在这个控制器里使用 GitHubService 这个服务里面的 login 方法 ...
myApp.controller('UserController', function ( GitHubService) {
GitHubService.login();
});
这样这个控制器加载以后,就会立即去执行 GitHubService 的 login 方法 ... 也就会在控制台上输出使用 $q 创建的 Deferred 对象了 ...
在 index.html 这个文档里面,我们已经把 UserController 用到了一个 div 元素上面 ... 打开浏览器的控制台 ... 在这里你会看到这个 Deferred 对象 ...
这个对象里面有几个方法,notify ,负责通知异步处理的过程 ... reject,表示拒绝,可以用它来拒绝 promise ,还有 resovle ,用来决定要去做一些事情 ... 另外还有一个 promise 属性 ... 在这个属性里面你会看到 $$state ... 履行或者拒绝 promise 带来的内容会包含在这个属性里面,现在这里还没有什么东西。
这个 promise 属性里面,还有一个 then 这个方法 ... 一会儿我们会用到它来处理履行或者拒绝 promise 之后要做的事情。