Javascript AngularJS:工厂返回对象的正确方法?

Javascript AngularJS:工厂返回对象的正确方法?,javascript,angularjs,angularjs-factory,Javascript,Angularjs,Angularjs Factory,我要在Angular.js项目中检索一个POST数据。这是我的工厂: angular.module('mtApp').factory('getKey', function($http) { return { getData: function(data) { var key=''; return $http({ url: '../php/key_gen.php',

我要在Angular.js项目中检索一个POST数据。这是我的工厂:

angular.module('mtApp').factory('getKey', function($http) {
    return {
        getData: function(data) {
            var key='';
            return $http({
                url: '../php/key_gen.php',
                method: "POST",
                headers: {'Content-Type': 'application/json'}
                }).success(function (data) {
                    console.log(data); //value is right as expected
                    return data;
                })
                .error(function (data, status, headers, config) {
                    console.log('Erro : ' + status + ' ' + headers);
                });
        }
    }
});
我获取数据的方式是:

$scope.key = 'ok';

getKey.getData()
.success(function($scope,data){
    $scope.key = data.GeneratedKey;
    console.log(data.GeneratedKey); //undefined
    console.log(data);  //200 o.O
});

console.log($scope.key); //still 'ok' O.o
正如您在代码中看到的,我有几个console.log调用。当我运行应用程序时,我唯一看到的是:

mtapp.controller.js:13 ok
mtapp.app.js:52 Object {GeneratedKey: "d1bc7a5e840a6c24d87b90dde9e075de1f0e3b34978ca9f319…69d839b4e2a004e1f8d728939867afe189cfb8848c6a8ee38"}
mtapp.controller.js:9 undefined
mtapp.controller.js:10 200
行mtapp.app.js:52中的值应与mtapp.controller.js:10相同。但是当我尝试在日志中查看时,工厂中的对象只有200的值

我的目标是从工厂中的JSON(GeneratedKey)获取值,并将其传递给控制器(,在$scope.key中)


我做错了什么(

因为您处理的是第二个参数,即状态代码,所以应该从中删除
$scope
,并使用
数据本身

代码

getKey.getData()
.success(function(data, status, headers, config){ <---here $scope should remove
    $scope.key = data.GeneratedKey;
    console.log(data.GeneratedKey);
    console.log(data);
});
getKey.getData()

.success(函数(数据、状态、标题、配置){尝试在工厂中使用$q

angular.module('mtApp').factory('getKey', function($http, $q) {
    var  getData= function(data) {
            var key='';
            var url = '../php/key_gen.php';
            var returned = $http.post(url, data);
            return $q.all(returned);

        };
     var getKey = {
    getData: getData

  };


  return getKey;
});


$scope.key = 'ok';

getKey.getData(someData).then(function (response, status, headers, config) {
    console.log(response.data.GeneratedKey);
});

正如Kevin所说,angular.js的主要问题是异步工作方式

最大的问题是最后一行

console.log($scope.key); //still 'ok' O.o
需要在调用工厂的函数结束之前进行设置。并且$scope已从函数中删除,以便正常工作,正如pankajparkar所说

$scope.key = 'ok';

getKey.getData()
.success(function(data){ // removed the $scope
    $scope.key = data.GeneratedKey;
    console.log($scope.key); //Moved up and it shows correctly in the console
    ... the rest of my code ...
});

我不知道这是否是最好的解决方案,但现在起作用了!:D

为什么您接受成功回调的第一个参数为$scope?从您在工厂中使用的回调判断,您知道应该是数据…第二个参数是状态码。我应该是
.success(函数(数据,$scope){
.success(函数(数据,状态码){
还没有工作。行
控制台.log($scope.key);//仍然是'ok'O.O
仍然只打印'ok'。它应该打印'ok'。ajax是异步的。太棒了!这就是问题所在。但我只是不知道为什么我会使用它。可能是错误地使用了一个示例:(@dipievil什么例子?你试过阅读文档吗?@KrzysztofSafjanowski这很简单,但仍然有问题。
$scope.key='';getKey.getData().success(函数(数据){$scope.key=data.GeneratedKey;console.log(data.GeneratedKey);});console.log($scope.key)
$scope.key仍然为空。我想这就是我在调用中放入$scope的原因。@dipievil您不应该将
$scope
传递给服务。我不知道为什么会发送someData。我想从工厂获取数据,而不是发送给工厂。删除它时,我遇到了错误
类型错误:无法读取未定义的
getData acc的属性“GeneratedKey”接受一个参数,即someData。您应该能够从response中获取生成的密钥。response.data在控制台中返回什么?这是一个反模式。没有理由仅为了再次包装而取消包装承诺。只需返回由
$http.post(…)返回的承诺即可
someData
是一个变量?!如果你不需要getData中的参数,你需要在你的工厂中删除它。所以,是的,它是一个变量。你错过了Kevin说的部分。你是在说异步部分吗?这在你制作ajax时很明显?