如何通过回调函数正确使用 promises

How to use promises correctly with callback function

我有这个服务,它returns一个使用回调异步的学生列表:

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

警报成功从路由返回数据,但不是从控制器返回数据 - 我在控制器中得到一个 undefined:

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

任何帮助将不胜感激!

您应该始终 return 承诺来解析函数,并且在创建您自己的承诺时,您应该使用需要传递的数据来解决它。

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