как выполнить инструкцию после выполнения обещания?

0

Я использовал следующий каталог в своем шаблоне. Я хочу изменить значение модели drop-down на id, потому что я использовал его ниже.

  <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;

            }
        };
    })

Однажды, если я попытаюсь вернуть значение ng-модели, в конце блок также не работает

    .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;
            }
        };
    })

я использовал службу Profile.getDegreeList(), чтобы присвоить идентификатору соответствующий выпадающий элемент, используя ngModel. $ parsers.push(). Проблема заключается в том, что при использовании сервиса до того, как обещание завершится, оно вернет предыдущий назначенный идентификатор. я хочу предотвратить его и вернуть идентификатор обещания. как решить эту проблему, пожалуйста, помогите?

Теги:
angularjs-scope
angularjs-directive
angularjs-ng-model
angular-promise

1 ответ

1

Вы можете использовать метод finally который будет выполнен после выполнения обещания.

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
    }
);

Здесь вы сначала делаете вызов, а затем используете парсеры.

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 ;
    });
});

См. Другие ссылки также для получения дополнительной информации.

  • 0
    мы можем вернуть значение в блоке finally?
  • 0
    я добавил проверенный выше моего кода?
Показать ещё 10 комментариев

Ещё вопросы

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