Javascript 如何正确使用回调来使用AngularJS中的API
我的问题是在将数据发送给控制器之前,从API中消费数据并对其进行有效建模。我有一个从API获取用户数据的工厂。给我带来特别麻烦的函数是providedaluserdata函数 这是我的services.jsJavascript 如何正确使用回调来使用AngularJS中的API,javascript,angularjs,Javascript,Angularjs,我的问题是在将数据发送给控制器之前,从API中消费数据并对其进行有效建模。我有一个从API获取用户数据的工厂。给我带来特别麻烦的函数是providedaluserdata函数 这是我的services.js .factory('userDataService', function ($resource, settings){ var dataService = {}; var baseUrl = settings.baseUrl; dataS
.factory('userDataService', function ($resource, settings){
var dataService = {};
var baseUrl = settings.baseUrl;
dataService.getUsers = function () {
return $resource(baseUrl + 'user').query();
};
dataService.getUserById = function (user) {
return $resource(baseUrl + 'user/:id').get(
{
id : user
}
)
}
dataService.provideAllUserData = function (user) {
dataService.userData = {};
var userData = dataService.userData;
var updateUserData = function(callback){
dataService.getUserById(user).$promise.then(function (res) {
var fetchUserData = res;
userData['id'] = fetchUserData.id;
userData['name'] = fetchUserData.name;
userData['quizzes'] = fetchUserData.quizzes;
dataService.userData = userData;
callback();
});
}
var returnData = function() {
//console.log(dataService.userData);
console.log( dataService.userData)
}
updateUserData(returnData);
}
return dataService;
})
看起来它应该可以工作了,如果我在callback中输入console.log,它就会返回我想要的对象。但是,当我尝试将其记录到控制器中时,它返回一个未定义的值
这是我控制器的相关线路
console.log(userDataService.provideAllUserData(1));
请让我知道,如果我这样做是完全错误的,或者你会做什么不同的。我以前没有使用Angular,所以这是一种边学边用的情况。您希望异步代码以同步方式运行
console.log(userDataService.provideAllUserData(1));
这行不通。异步性是连续的,它也会影响调用代码
首先,放弃你的回访,只使用承诺
dataService.provideAllUserData = function (user) {
dataService.userData = {};
var userData = dataService.userData;
// "then" returns a promise. Meaning, multiple thens can be chained.
return dataService.getUserById(user).then(function (res) {
var fetchUserData = res;
userData['id'] = fetchUserData.id;
userData['name'] = fetchUserData.name;
userData['quizzes'] = fetchUserData.quizzes;
dataService.userData = userData;
});
}
然后,在调用代码中:
userDataService.provideAllUserData(1).then(function(data) {
console.log(data);
});
您没有从ProvidealUserData方法返回任何内容。这就是为什么console.log在您使用承诺而不是回调时为您提供未定义的功能。我不会把两者混为一谈的,谢谢。这就把事情弄清楚了。我真的不知道承诺和()是如何运作的。