假设有这样的一个场景:

我们知道一个用户某次航班,抽象成一个departure,大致是:

{userID : user.email,flightID : "UA_343223",date: "01/14/2014 8:00 AM"}

有关航班的,抽象成一个flight,大致是:

{id: flightID,pilot : "Captain Morgan", plane : {make  : "Boeing 747 RC",model : "TA-889"},status: "onTime"}

有关天气情况的,抽象成forecast,大致是:

{date: date,forecast : "rain"}

我们的需求是:

● 显示departure相关:departure.date
● 显示flight相关:flight.plane.make, flight.plane.model
● 显示foreacst相关:weather.forecast

实现逻辑大致是:

→ 根据departure中的flightID获取flight
→ 根据departure中的date获取forecast

首先模拟一些服务:

(function(angular){
angular.module("FlightServices",[])
.service("user", function(){
return{
email: 'exmaple@qq.com',
repository:"https://github.com/ThomasBurleson/angularjs-FlightDashboard"
};
})
.service("travelService", function(user, $q){
return{
//根据用户获取departure
getDeparture: function(user){
var defer = $q.defer(); defer.resolve({
userID : user.email,
flightID : "UA_343223",
date : "01/14/2014 8:00 AM"
});
return defer.promise;
},
getFlight: function(flightID){
return $q.resolve({
id : flightID,
pilot : "Captain Morgan",
plane : {
make : "Boeing 747 RC",
model : "TA-889"
},
status: "onTime"
});
}
};
})
.service("weatherService", function($q){
return {
getForecast: function(date){
return $q.resolve({
date : date,
forecast : "rain"
});
}
};
});
}(window.angular));

以上,模拟了一些数据,让我们最终能获取到如下数据:

有关用户的:

{
    email: 'exmaple@qq.com',
    repository:"https://github.com/ThomasBurleson/angularjs-FlightDashboard"
};

有关depature的,通过getDeparture(user)获取到一个promise

{
    userID   : user.email,
    flightID : "UA_343223",
    date     : "01/14/2014 8:00 AM"
}

有关depatrue的,通过getFlight(flightID)获取到一个promise

{
    id    : flightID,
    pilot : "Captain Morgan",
    plane : {
        make  : "Boeing 747 RC",
        model : "TA-889"
    },
    status: "onTime"
}

有关forecast的,通过getForecast(date)获取到一个promise

{
     date     : date,
     forecast : "rain"
}

接下来就从以上服务所提供的promise数据中获取,由于是promise,所有就可以then,可能会这样写:

var FlightDashboard = function($scope, user, travelService, weatherService){
$scope.user = user; travelService
.getDeparture(user.email) //第一个请求
.then(function(depature){
$scope.departure = depature; //第二个请求
travelService
.getFlight(departure.flightID)
.then(function(flight){
$scope.flight = flight; //第三次请求
weatherService
.getForecast(departure.date)
.then(function(weather){
$scope.weather = weather;
})
})
}) };

但以上写法的缺点是层级太多。一种更好的写法是:

(function(){
"use strict"; var FlightDashboard = function($scope, user, travelService, weatherService){
var loadDeparture = function (user) {
return travelService
.getDeparture(user.email)
.then(function(departure){
$scope.departure = departure;
return departure.flighID;
}); });
},
loadFlight = function(flightID){
return travelService
.getFlight(flightID)
.then(function(flight){
$scope.flight = flight;
return flight;
});
},
loadForecast = function(){
return weatherService
.getForecast($scope.departure.date)
.then(function(weather){
$scope.weather = weather;
return weather;
});
}; loadDeparture(user)
.then(loadFlight)
.then(loadForecast); $scope.user = user;
$scope.departure = null;
$scope.flight = null;
$scope.weather = null;
; window.FlightDashboard = ["$scope","user","travelService", "weatherService", FlightDashboard];
}());

以上,loadDeparture返回的flightID作为loadFligth的参数。

AnguarJS中链式的一种更合理写法的更多相关文章

  1. 简谈 JavaScript、Java 中链式方法调用大致实现原理

    相信,在 JavaScript .C# 中都见过不少链式方法调用,那么,其中实现该类链式调用原理,大家有没有仔细思考过?其中 JavaScript 类库:jQuery 中就存在大量例子,而在 C# 中 ...

  2. jquery中链式操作的this指向

    jquery中链式操作是如何实现? 例如:$(obj).children().css('color','red').next().css('color','red').siblings().css(' ...

  3. caioj 1075 动态规划入门(中链式2:能量项链)(中链式dp总结)

    我又总结了一种动归模型-- 这道题和上一道题很类似,都是给一个序列,然后相邻的元素可以合并 然后合并后的元素可以再次合并 那么就可以用这两道题类似的方法解决 简单来说就是枚举区间,然后枚举断点 加上断 ...

  4. caioj 1076 动态规划入门(中链式3:最大的算式)

    一开始写了一个复杂度很大的方法,然后还过了(千万记得开longlong ) #include<cstdio> #include<cstring> #include<alg ...

  5. caioj 1074 动态规划入门(中链式1:最小交换合并问题)

    经典的石子合并问题!!! 设f[i][j]为从i到j的最大值 然后我们先枚举区间大小,然后枚举起点终点来更新 f[i][j] = min(f[i][k] + f[k+1][j] + sum(i, j) ...

  6. js中if语句的几种优化代码写法

    UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法. 一.使用常见的三元操作符 复制代码 代码如下: if (foo) bar(); ...

  7. 数据结构队列的java实现,包括线性和链式两种方式

    实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...

  8. 队列(链式队列)----C语言

    链式队列----用链表实现,链式队列就是一个操作受限的单向链表,如果读者了解单向链表的建立过程,那理解链式队列就很容易了,先回顾一下单向链表的建立过程 (不熟悉单向链表的可以先看看另一片随笔,再回来看 ...

  9. javascript函数式编程和链式优化

    1.函数式编程理解 函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解.抽象一般的表达式 与命令式相比,这样做的好处在哪?主要有以下几点: (1)语义更加清晰 (2)可复用性更高 (3) ...

随机推荐

  1. OCM_第一天课程:OCM课程环境搭建

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  2. python----线程进程协程

    python线程: import threading import time def show(arg): time.sleep() print('thread' + str(arg)) ): t = ...

  3. visual studio 2015百度云下载

    visual studio 2015百度云下载 https://pan.baidu.com/s/1b198Zo3mX5_zA2VX3xRRfw 提取码: 关注公众号[GitHubCN]回复2015获取

  4. Python String 方法详解

    官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods 官网 公号:软测小生ruancexiaosheng 文档里的 ...

  5. xhprof扩展安装与使用

    目录 一.xhprof扩展安装步骤 二.xhprof的使用 总结 参考资料 一.xhprof扩展安装步骤 xhprof是PHP的一个扩展,最好也直接安装上graphviz图形绘制工具(用于xhprof ...

  6. memcahe

    网站的瓶颈 主要集中在数据库 ,用缓存(直接操作内存) 存储计算机的内存,如果一旦服务器断电,数据都将清空 内存:memcached redis基于文档:mongodb memcache:基于内存的高 ...

  7. POJ1962:Corporative Network【带权并查集】

    <题目链接> 题目大意: n个节点,若干次询问,I x y表示从x连一条边到y,权值为|x-y|%1000:E x表示询问x到x所指向的终点的距离.   解题分析: 与普通的带权并查集类似 ...

  8. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  9. 001.LVS简介及算法

    一 LVS简介 1.1 LVS介绍 LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以再unix/linux平台下实现负载均衡集群功能. 使用 ...

  10. LVN与其在Linux上的实现

    参考资料: LVM详解-骏马金龙-博客园 How to reduce the size of an LVM partition formatted with xfs filesystem on Cen ...