Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确使用回调来使用AngularJS中的API_Javascript_Angularjs - Fatal编程技术网

Javascript 如何正确使用回调来使用AngularJS中的API

Javascript 如何正确使用回调来使用AngularJS中的API,javascript,angularjs,Javascript,Angularjs,我的问题是在将数据发送给控制器之前,从API中消费数据并对其进行有效建模。我有一个从API获取用户数据的工厂。给我带来特别麻烦的函数是providedaluserdata函数 这是我的services.js .factory('userDataService', function ($resource, settings){ var dataService = {}; var baseUrl = settings.baseUrl; dataS

我的问题是在将数据发送给控制器之前,从API中消费数据并对其进行有效建模。我有一个从API获取用户数据的工厂。给我带来特别麻烦的函数是providedaluserdata函数

这是我的services.js

.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在您使用承诺而不是回调时为您提供未定义的功能。我不会把两者混为一谈的,谢谢。这就把事情弄清楚了。我真的不知道承诺和()是如何运作的。