• 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的参数。

  • 相关阅读:
    java生成压缩文件
    设计模式读书笔记-----外观模式
    设计模式读书笔记-----适配器模式
    设计模式读书笔记-----命令模式
    SpringMVC学习笔记七:SpringMVC统一异常处理
    SpringMVC学习笔记六:使用 hibernate-validator注解式数据校验
    SpringMVC学习笔记六:使用Formatter解析或格式化数据
    SpringMVC学习笔记五:使用converter进行参数数据转换
    SpringMVC学习笔记二:常用注解
    SpringMVC学习笔记四:数据绑定
  • 原文地址:https://www.cnblogs.com/darrenji/p/5163213.html
Copyright © 2020-2023  润新知