how to execute the statement after promise is exec

2019-09-03 08:38发布

问题:

I have used the following directory in my template i want to change the model value of drop-down to id for it i have used as bellow

  <md-select flex class="md-select-form" ng-model="education.degree" placeholder="Degree" save-id id="education.degree_id" ">
      <md-option ng-value="degree" ng-repeat="degree in ['High School', 'Associates Degree', 'Bachelor Degree', 'Masters Degree', 'M.B.A', 'M.D', 'Ph.D', 'other']">{{degree}}</md-option>
  </md-select>

.directory code

    .directive('saveId', function(Profile){
        return {
            require: 'ngModel',
            scope: {
                id: '=',
                requiredParam:'@'
            },        
            link: function(scope, element, attrs, ngModel) {
                console.log("initial loading");
                // view --> model (change to string)            
                ngModel.$parsers.push(function(viewValue){
                    var keepGoing = true;                
                    Profile.getDegreeList().then(function(data) {
                        angular.forEach(data, function(ob){
                            if(keepGoing) {
                                if(ob.degree == viewValue){
                                    scope.id = ob.degree_id;
                                    keepGoing = false;
                                }
                            }
                        });
                        console.log("within promise"+scope.id); //it executes second
                    });
                    console.log(scope.id);  //it executes first      
                    return scope.id;

                });
                return scope.id;

            }
        };
    })

Once if i try to return the value of ng-model in finally block it also not working

    .directive('saveId', function(Profile){
        return {
            require: 'ngModel',
            scope: {
                id: '=',
                requiredParam:'@'
            },        
            link: function(scope, element, attrs, ngModel) {
                console.log("initial loading");
                // view --> model (change to string)            
                ngModel.$parsers.push(function(viewValue){
                               // var id = -1;
                    var keepGoing = true;                
                    Profile.getDegreeList().then(function(data) {
                        angular.forEach(data, function(ob){
                            if(keepGoing) {
                                if(ob.degree == viewValue){
                                    scope.id = ob.degree_id;
                                    keepGoing = false;
                                }
                            }
                        });
                    }).finally(function(res){
                        console.log(scope.id);        
                        return scope.id;                    
                    });
                });
                return scope.id;
            }
        };
    })

i have used Profile.getDegreeList() service to assign the id to relevant drop-down element by using ngModel.$parsers.push(). The problem is in case of service usage before promise going to complete it returns the previous assigned id . i want to prevent it and need to return the promise id. how to solve this issue please help?

回答1:

You can use finally method which will be executed after executing promise.

Profile.getDegreeList()
    .success(function(data)
    {
        angular.forEach(data, function(ob)
        {
            if (keepGoing)
                if (ob.degree == viewValue) {
                    scope.id = ob.degree_id;
                    keepGoing = false;
                }
        });
        console.log("within promise"+scope.id);
    })
    .finally(function(res)
    {
        // your code
    }
);

Here you go first make a call and then use parsers.

Profile.getDegreeList().then(function(data) {
    angular.forEach(data, function(ob) {
        if (keepGoing) {
            if (ob.degree == viewValue) {
                scope.id = ob.degree_id;
                keepGoing = false;
            }
        }
    });
    ngModel.$parsers.push(function(viewValue) {
        var keepGoing = true;
       return scope.id ;
    });
});

See other links too for more guidance.