簡體   English   中英

如何通過回調函數正確使用Promise

[英]How to use promises correctly with callback function

我有此服務,它使用回調異步返回學生列表:

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

任何幫助將不勝感激!

您應該始終返回一個承諾以解析功能,當創建自己的承諾時,應使用需要傳遞的數據來解決它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM