AngularJS中promise的使用

在看AngularJS的一本教材時,某章突然遇到了$q服務的使用。也許是書的編排問題——將成網狀互相依賴的模塊用線性順序書寫——總之我是始終搞不明白爲什麼要這麼用,用了有什麼好處。html

沒有後端的前端如同空中樓閣。我用node.js和mongodb搞了一個簡單的restful服務,前端用AngularJS。通過一遍遍的排錯,最終差很少理解了$q的用法和優勢。前端

不使用$qnode

服務mongodb

app.factory('BokanWork', ['$resource', function($resource){
    return $resource('api/bokanwork/:id', {});
}]);

控制器,注入服務BokanWork數據庫

app.controller('BokanWorkListCntl', ['$scope', 'BokanWork', function($scope, BokanWork){
    $scope.bokanWorkList = BokanWork.query();    
}]);

顯示問題:後端

路由跳轉後才進行數據庫訪問,數據區域會出現短暫空白。api

使用$qpromise

服務restful

注入服務$q和BokanWork,建立promise服務MultiBokanWorkLoader。app

{id: '@_id'}的意思是說,在POST/DELETE等請求時,將對象裏的_id字段(mongodb的ObjectId)提取出來,填補在url對應的id裏。

順便一提,Node.JS某本教材上是用PUT請求進行更新……這裏我給改爲POST咯……

services.factory('BokanWork', ['$resource', function($resource){
    return $resource('api/bokanwork/:id', {id: '@_id'});
}]);

services.factory('MultiBokanWorkLoader', ['BokanWork', '$q', function(BokanWork, $q){
    return function() {
        var delay = $q.defer();
        BokanWork.query(function(works){
            delay.resolve(works);
        }, function(){
            delay.reject('Unable to fetch BokanWork lists');
        });
        return delay.promise;
    };
}]);

路由配置。

resolve配置在promise解決後要注入的參數bokanWorkList

when('/bokanwork', {
    templateUrl: 'tpl/bokanwork_list.html',
    controller: 'BokanWorkListCntl',
    resolve: {
        bokanWorkList: function(MultiBokanWorkLoader) {
            return MultiBokanWorkLoader();
        }
    }
})

控制器,注意參數bokanWorkList,是在路由配置注入的。

controllers.controller('BokanWorkListCntl', ['$scope', 'bokanWorkList', function($scope, bokanWorkList){
    $scope.bokanWorkList = bokanWorkList;
    $scope.remove = function(index){
        $scope.bokanWorkList[index].$remove(function(){
            $scope.bokanWorkList.splice(index, 1);
        });
    };
}]);

優點:在數據獲取以後(即promise resolve以後)才進行路由跳轉,數據區域不會空白。

相關文章
相關標籤/搜索