0

Я эта услуга, она возвращает список студентов асинхронно с помощью обратного вызова:Как правильно использовать обещание с функцией обратного вызова

studentModule.factory('StudentService', function (DB_URL) { 
     return { 
      getAllStudents: function (callback) { 
       var Datastore = require('nedb'), 
        path = require('path'); 
       db = {}; 
       db.students = new Datastore({ 
        filename: DB_URL + '/students.db', 
        autoload: true 
       }); 
       db.students.find({}, function (err, stds) { 
        callback(stds); 
       }); 
      }; //end return 

Моего старого способ, чтобы использовать его в контроллере:

StudentService.getAllStudents(function(sts) { 
    $scope.students = sts; 
    $scope.$apply();//notify angular about the change 
}); 

Это работает для меня, но теперь я хочу использовать некоторые лучшие практики. Мне нужно, чтобы решить результат в пути до прихода к контроллеру, вот что я сделал:

.state('payment', { 
    url: '/payment', 
    templateUrl: 'frontend/components/payment/views/payment.html', 
    controller: 'PaymentController', 
    resolve: { 
     students: function (StudentService, $q) { 
      var defer = $q.defer(); 
      defer.promise.then(function() { 
       StudentService.getAllStudents(function (sts) { 
        alert(JSON.stringify(sts)); 
        return sts; 
       }); 
      }) 
      defer.resolve(); 
     } 
    } 
}) 

Оповещение возвращает данные из маршрута успешно, но не от контроллера - я получаю неопределенную в контроллер:

paymentModule.controller('PaymentController', function($scope,students) { 
    alert(JSON.stringify(students)); 

Любая помощь будет оценена!

+0

Вы не вернули обещание решить вашу проблему. –

+0

Вы также не решили свое обещание с данными, вы решили его ни с чем. –

+0

Спасибо, я проверю это, я новичок в обещаниях, пожалуйста, несите меня. Вы также можете ответить на вопрос, пока я проверяю свой код. –

ответ

2

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

.state('payment', { 
    url: '/payment', 
    templateUrl: 'frontend/components/payment/views/payment.html', 
    controller: 'PaymentController', 
    resolve: { 
     students: function (StudentService, $q) { 
      var defer = $q.defer(); 
      //defer.promise.then(function() { 
      StudentService.getAllStudents(function (sts) { 
       //alert(JSON.stringify(sts)); 
       //return sts; 
       defer.resolve(sts); 
      }); 
      //}) 
      //defer.resolve(); 
      return defer.promise 
     } 
    } 
}) 
+1

Я бы вместо этого предоставил сервис, обещание, но оба варианта работают. –

+0

Да, он будет более чистым. это заставка для меня, спасибо Кевину! –

Смежные вопросы