AnguarJS中链式的一种更合理写法
假设有这样的一个场景:
我们知道一个用户某次航班,抽象成一个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中链式的一种更合理写法的更多相关文章
- 简谈 JavaScript、Java 中链式方法调用大致实现原理
相信,在 JavaScript .C# 中都见过不少链式方法调用,那么,其中实现该类链式调用原理,大家有没有仔细思考过?其中 JavaScript 类库:jQuery 中就存在大量例子,而在 C# 中 ...
- jquery中链式操作的this指向
jquery中链式操作是如何实现? 例如:$(obj).children().css('color','red').next().css('color','red').siblings().css(' ...
- caioj 1075 动态规划入门(中链式2:能量项链)(中链式dp总结)
我又总结了一种动归模型-- 这道题和上一道题很类似,都是给一个序列,然后相邻的元素可以合并 然后合并后的元素可以再次合并 那么就可以用这两道题类似的方法解决 简单来说就是枚举区间,然后枚举断点 加上断 ...
- caioj 1076 动态规划入门(中链式3:最大的算式)
一开始写了一个复杂度很大的方法,然后还过了(千万记得开longlong ) #include<cstdio> #include<cstring> #include<alg ...
- caioj 1074 动态规划入门(中链式1:最小交换合并问题)
经典的石子合并问题!!! 设f[i][j]为从i到j的最大值 然后我们先枚举区间大小,然后枚举起点终点来更新 f[i][j] = min(f[i][k] + f[k+1][j] + sum(i, j) ...
- js中if语句的几种优化代码写法
UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法. 一.使用常见的三元操作符 复制代码 代码如下: if (foo) bar(); ...
- 数据结构队列的java实现,包括线性和链式两种方式
实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...
- 队列(链式队列)----C语言
链式队列----用链表实现,链式队列就是一个操作受限的单向链表,如果读者了解单向链表的建立过程,那理解链式队列就很容易了,先回顾一下单向链表的建立过程 (不熟悉单向链表的可以先看看另一片随笔,再回来看 ...
- javascript函数式编程和链式优化
1.函数式编程理解 函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解.抽象一般的表达式 与命令式相比,这样做的好处在哪?主要有以下几点: (1)语义更加清晰 (2)可复用性更高 (3) ...
随机推荐
- 火狐mozilla官方ftp站点获取旧版本火狐的下载地址
http://ftp.mozilla.org/pub/firefox/releases/
- Spring整合strus2简单应用总结
本身strus2没接触过,所以这块学的一知半解,正常不整合的还没学(接着学) step: 1.创建web工程 2.在/WEB-INF/lib引入jar包 asm-3.3.jarasm-commons- ...
- totastmessage 触发事件后浮框消失的方法
1. 前言 通过查了官放的文档,发现没有 totastmessage 触发事件后,浮框消失的方法,然后通过研究了下点击关闭时的源码,得到了一个的解决方案. 2. 样例代码如下 $("#dro ...
- JS算法之二分查找
二分查找法主要是解决「在一堆有序的数中找出指定的数」这类问题,不管这些数是一维数组还是 多维数组,只要有序,就可以用二分查找来优化. 二分查找是一种「分治」思想的算法,大概流程如下: 1.数组中排在中 ...
- from opencv image to PIL image and reverse
import cv2 import numpy as np from PIL import Image img = cv2.imread("path/to/img.png") # ...
- C#的基础
一:Ref和Out 的区别: 1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键 ...
- Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- 084 HBase的数据迁移(含HDFS的数据迁移)
1.查找命令 bin/hadoop 2.启动两个HDFS集群 hadoop0,hadoop1,都是伪分布式的集群 3.启动hadoop3的zookeeper与hbase 注意点:需要开启yarn服务, ...
- Mysql索引为什么用B+树而不用B-树
先从数据结构的角度来看 我们知道B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所 ...
- Laravel 核心概念
工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...