Как бороться с вложенными обещаниями в Javascript AngularJS - PullRequest
0 голосов
/ 26 апреля 2018

Функция 2 использует возврат функции 1, в то время как функция 3 использует оба возврата, как это сделать чисто? Функция 3 только возвращает мне неопределенные значения прямо ном.

Вот мои 3 функции.

Функция1

$scope.nombreCompetencesATraiter = function(){
var nbr = 0;
        notesService.getNotesByCollaborateurId($scope.idCollaborateurSelectionne).then(function(data){
            $scope.myNotes = data;
            angular.forEach($scope.myNotes, function(valueNote, keyNote) {
                if ((valueNote.status === "EN_ATTENTE_DE_VALIDATION") || (valueNote.status === "EN_ATTENTE_DE_SUPPRESSION")){
                    nbr++;
                }
            })
            console.log(nbr);
            return nbr;
        })
    }

Функция 2

$scope.affinerConfigBoutonsCompetences = function() {
        nbCompetenceATraiter = $scope.nombreCompetencesATraiter();
        if (nbCompetenceATraiter == 0){
            $scope.radioModelFilterToutesLesCompetences = true;
            $scope.radioModelFilterCompetencesAValider = false;
        }
        else{
            $scope.radioModelFilterCompetencesAValider = true;
            $scope.radioModelFilterToutesLesCompetences = false;
        }
    }

Функция 3

$scope.affinerConfigBoutonsCompetencesThen = function(){
        $q.all([$scope.nombreCompetencesATraiter(), $scope.affinerConfigBoutonsCompetences()]).then(function(value) {
            console.log(value[0]);
            console.log(value[1]);
        })
    }

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

У вас есть некоторые ошибки, о которых упоминал Луиллиф, и в целом это самый краткий способ разрешения этой зависимости.

var f1 = () => new Promise( resolve => resolve('value1'));
var f2 = ( value1 ) => new Promise( resolve => resolve('value2'));
var f3 = ( value1, value2 ) => new Promise( resolve => resolve('done'));

f1()
    .then( value1 => Promise.all([ value1, f2( value1 ) ]) )
    .then( ([ value1, value2 ]) => f3( value1, value2 ))

Удобно использовать Promise.all со значениями не-Promise, он просто передает их прямо на then.

0 голосов
/ 26 апреля 2018

Функция 1 отсутствует оператор возврата перед вызовом noteService

$scope.nombreCompetencesATraiter = function() {
var nbr = 0;
  return notesService.getNotesByCollaborateurId($scope.idCollaborateurSelectionne)
    .then(function(data) {
      $scope.myNotes = data;
      angular.forEach($scope.myNotes, function(valueNote, keyNote) {
        if ((valueNote.status === "EN_ATTENTE_DE_VALIDATION") || (valueNote.status === "EN_ATTENTE_DE_SUPPRESSION")) {
          nbr++;
        }
      })
      console.log(nbr);
      return nbr;
  })
}

Функция 2

$scope.affinerConfigBoutonsCompetences = function() {
  return $scope.nombreCompetencesATraiter().then(function (value) {
    nbCompetenceATraiter = value;
    if (nbCompetenceATraiter == 0) {
      $scope.radioModelFilterToutesLesCompetences = true;
      $scope.radioModelFilterCompetencesAValider = false;
    } else {
      $scope.radioModelFilterCompetencesAValider = true;
      $scope.radioModelFilterToutesLesCompetences = false;
    }
    return nbCompetenceATraiter // value you want to return
  });
}

Функция 3

$scope.affinerConfigBoutonsCompetencesThen = function(){
    $q.all([$scope.nombreCompetencesATraiter(), $scope.affinerConfigBoutonsCompetences()]).then(function(value) {
        console.log(value[0]);
        console.log(value[1]);
    })
}

Пусть теперь, как это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...