Стероиды / сверхзвуковые с анализом данных

Я занимаюсь разработкой приложения со Steroids/Supersonic, используя Parse в качестве бэк-энда, и я изо всех сил пытаюсь заставить объектные отношения работать. Вот пример. У меня есть один классный курс и один классный учитель с отношениями один к одному (в каждом курсе один учитель). То, что я хотел бы сделать, это показать все курсы с соответствующим преподавателем. Чтобы установить отношения в Parse, я использовал тип столбца "Pointer" для другого класса. Ниже код в контроллере:

Course.findAll().then( function (courses) {
        $scope.$apply( function () {
          $scope.courses= courses;

          for (i = 0; i < $scope.courses.length; i++) {
          // look for the teacher
         Teacher.find($scope.courses[i].Teacher.objectId).then( function (teacher) {
            $scope.$apply( function () {
              $scope.courses[i].Teacher= teacher;
            }); 
          });   
          }
        });
      });

Проблема приведенного выше кода заключается в том, что переменная "i" не определена внутри функции Teacher.find(), поэтому я не могу назначить объект учителя для правильного объекта курса. Я даже пытался использовать определенную переменную в области видимости для управления индексом, как в этом другом коде:

Course.findAll().then( function (courses) {
        $scope.$apply( function () {
          $scope.courses= courses;
          $scope.index = 0
          for (i = 0; i < $scope.courses.length; i++) {
          // look for the teacher
         Teacher.find($scope.courses[i].Teacher.objectId).then( function (teacher) {
            $scope.$apply( function () {
              $scope.courses[$scope.index].Teacher= teacher;
              $scope.index = $scope.index + 1
            }); 
          });   
          }
        });
      });

Проблема этого второго кода заключается в том, что учитель случайно связан с неправильным курсом, возможно, потому что функция find () называется асинхронной, поэтому две переменные i и index не всегда синхронизированы.

Я полагаю, что проблема, с которой я сталкиваюсь, больше связана с асинхронным поведением angularjs, но я не знаю, как ее решить. Спасибо за вашу помощь!

1 ответ

Я вообще не проверял это, но, пытаясь взглянуть на замыкания, я мог представить, что это сработает.

Course.findAll().then( function (courses) {
        $scope.$apply( function () {
          $scope.courses= courses;
          $scope.index = 0
          for (i = 0; i < $scope.courses.length; i++) {
              // look for the teacher
              var course = $scope.courses[i]; // to keep available in closure
         Teacher.find(course.Teacher.objectId).then( function (course, teacher) {
            $scope.$apply( function () {
              course.Teacher= teacher; // course should be available here, due to the closure

            }); 
          });   
          }
        });
      });
Другие вопросы по тегам