Написание функции обратного вызова в угловых JS

0

У меня есть страница, где мне нужно нажать 2 успокоительных вызова веб-службы. 1-й вызов отдыха выполняется успешно, и я возвращаю данные. После удара 2-й службы все данные 1-го вызова сохраняются в переменной. Таким образом, использование метода обратного вызова является решением для этого? Если да, то как написать метод обратного вызова способом angularjs?

Вот мой код.

app.directive('collection', function() {
    return {
        restrict: "E",
        replace: true,
        scope: {
            collection: '=',
            articleData: '=',
            articleContent: '='
        },
        template: "<ul><member ng-repeat='member in collection' member='member' article-data='articleData' article-content='articleContent'></member></ul>"
    }
});

app.directive('member', function($compile,$http,getTocService) {
    return {
        restrict: "A",
        replace: true,
        scope: {
            member: '=',
            articleData: '=',
            articleContent: '='
        },
        template: "<div><li><a href='#' ng-click='getContent(member.itemId)'>{{member.title}}</a></li></div>",
        link: function(scope, element, attrs) {
            scope.getContent = function(itemId) {
                    var art = getTocService.getArtData(itemId);
            }

            if (angular.isArray(scope.member.tocItem)) {
                if (scope.member.hasChildren == "true") {
                    for (var i = 0; i < scope.member.tocItem.length; i++) {
                        if (scope.member.tocItem.title) {
                            scope.member.tocItem.title.hide = true;
                        }
                    }
                }
                element.append("<collection collection='member.tocItem'></collection>");    
                $compile(element.contents())(scope)
            }
        }
    }
});


app.controller('apdController', function($scope, getTocService,$location) {
    var bookId = $location.search().id;
    var sampdata = getTocService.getToc(bookId);
    $scope.tasks =sampdata;
//  $scope.tasks = data;

//    var artData = getTocService.getArtData('PH1234');
//    $scope.articleContent = artData;
});

app.service(
        "getTocService",
        function( $http, $q ) {
            return({
                getToc: getToc,
                getArtData: getArtData
            });

            function getToc(bookIdvar) {
                var request = $http({
                    method: "post",
                    url: "http://10.132.241.41:8082/apdpoc/services/ApdBookService/getTOC",
                    params: {
                        action: "post"
                    },
                    data: {
                        getTOCCriteria:{
                        bookId: bookIdvar
                        }
                    }
                });
                return( request.then(handleSuccess,handleError));
            }

            function getArtData(itemId) {
                var request = $http({
                    method: "post",
                    url: "http://10.132.241.41:8082/apdpoc/services/ApdBookService/getArticle",
                    params: {
                        action: "post"
                    },
                    data: {
                        getArticleCriteria:{
                        articleId: itemId,
                        locale: "en_US"
                        }
                    }
                });
                alert(data);
                return( request.then(handleSuccess,handleError));
            }
            function handleSuccess(response){
                return (response.data);
            }

            function handleError( response ) {

                if (
                    ! angular.isObject(response.data) ||
                    ! response.data.message
                    ) {
                    return($q.reject("An unknown error occurred."));
                }
                return($q.reject(response.data.message));
            }

        }
);

Здесь "данные" - это переменная, которую я использую в обоих вызовах для хранения данных ответа. И я вызываю 2-й сервис "getArtData" из

 var art = getTocService.getArtData(itemId);
  • 0
    Возможно, вам следует перенести этот вопрос в CodeReview, потому что в вашем коде больше проблем, чем просто цепочка обещаний.
Теги:
rest

2 ответа

1

Вы должны серьезно подумать об использовании обещаний. Обещания позволяют цепочки и намного лучше, чем обратный ад. Ключевое слово здесь используется тогда.

Это сообщение SO объясняет это лучше: обработка ответа $ http в службе

Надеюсь, это полезно для вас.

1

Ваш getTocService возвращает обещания, и вы должны приковать два обещания.

var bookId = $location.search().id;
var sampdataPromise = getTocService.getToc(bookId);

sampdataPromise.then( function(data) {
    $scope.tasks = data;
    //return next promise for chaining
    return getTocService.getArtData(data.itemId);
}).then (function (artData) {
    $scope.articleContent = artData;
}).catch (function (error) {
    //log error
});
  • 0
    Даже сейчас старые идентификаторы данных сохранялись после обращения ко 2-й службе restful, т. Е. После нажатия getArtData () также данные getToc () присутствуют.
  • 0
    Мне нужно увидеть код, который вы используете для цепочки . Также используйте поставщика фабрики вместо поставщика услуг для поставщика getTocService .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню