Javascript 如何在不使用承诺的情况下跨多个控制器访问工厂中的异步数据

Javascript 如何在不使用承诺的情况下跨多个控制器访问工厂中的异步数据,javascript,angularjs,Javascript,Angularjs,我试图将一些用户数据存储在一个服务中,该服务可以跨不同的控制器访问和修改,数据最初将通过$http调用提取。由于必须加载数据,我在以前的代码中使用了承诺,但这可能会让人非常恼火。例如,即使是一个基本的getter函数也必须按如下方式编写 UserData.getData().then(function(data) { //do something with the data }) 其中UserData.getData()始终通过deferred.promise返回一个承诺(如果数据已被

我试图将一些用户数据存储在一个服务中,该服务可以跨不同的控制器访问和修改,数据最初将通过$http调用提取。由于必须加载数据,我在以前的代码中使用了承诺,但这可能会让人非常恼火。例如,即使是一个基本的getter函数也必须按如下方式编写

UserData.getData().then(function(data) {
    //do something with the data
})
其中UserData.getData()始终通过
deferred.promise
返回一个承诺(如果数据已被提取,则立即解析)。我想知道是否有办法将a)$http调用和b)getter和setter方法拆分为两个不同的服务,这样,如果我从b)调用getter和setter方法,我就不需要用
包装所有内容,然后

例如,我试图让UserFactory负责$http调用,让UserData负责getter和setter。但是,我无法让代码正常工作,因为UserData.getData()将返回未定义的,不知道是否有人可以提供帮助?(我真的不想在任何地方都使用


then方法是异步执行的,因此返回方法不起作用。这就是为什么在数据到达之前,每次对getData的调用都将返回undefined

您可以尝试以下方法,如果希望在数据准备就绪时收到通知,或者只是等待在返回变量中填充数据,则可以指定回调

.factory('UserData', function(UserFactory) {
    var data = {};

    return {
        getData: function(callback) {
            UserFactory.getData().then(function(res) {
                angular.extend(data, res);
                if (callback) {
                    callback(data);
                }
            });
            return data;
        }
    }
})

为什么要让你的
UserFactory
泄露承诺?你可以设计一个更简单的界面,这样你就不需要在任何时候处理承诺了。嗨@Sebastian,谢谢你的回复!你对我能建立什么样的界面有什么建议吗?我不知道没有承诺怎么做。我检查了你的小提琴,它对我有用。延迟1s后,返回正确的数据。这不是你所期望的吗?@Sebastian如果你立即点击它,它会返回undefined,因为它是一个异步操作。我可以让它与承诺一起工作,但我不想总是写“.then(function(data){xxx})”,因为它非常详细,谢谢你!如果我使用回调或承诺,我可以让它工作,但它似乎相当冗长-我希望能够直接调用getData(),并让它a)如果数据已被提取,则立即返回数据,b)如果数据尚未提取,则稍后返回日期。想知道这是否可能
.factory('UserData', function(UserFactory) {
    var data = {};

    return {
        getData: function(callback) {
            UserFactory.getData().then(function(res) {
                angular.extend(data, res);
                if (callback) {
                    callback(data);
                }
            });
            return data;
        }
    }
})