在javascript中访问对象属性的问题显示未定义?

时间:2017-03-02 07:32:02

标签: javascript php angularjs

我只是调用api,它返回josn编码数据并尝试打印对象属性但显示未定义但是当我打印该对象时,该对象具有该属性和值。

我的代码

function sendData(postData, url){
        var response = apiCall(postData,url);
        console.log(response.email)
        console.log(response.count);
    }


    function apiCall(postData, postUrl){
        var response = {};
        $http({
            method  : 'POST',
            url     : postUrl,
            data    : postData, 
            headers : {'Content-Type': 'application/json'}
         }).success(function(data) {  
                console.log(data)
                for (var attr in data) {
                    if (data.hasOwnProperty(attr)) response[attr] = data[attr];
                }  
           });

         return response;   
    }

基于php的api

<?php 
    $_POST = json_decode(file_get_contents('php://input'), true);
    $response = array();

    $response['email'] = $_POST['oauth']['email'];
    $response['type'] = $_POST['oauth']['type'];
    echo json_encode($response);
?> 

控制台中的响应数据

  

对象{email:“sameerdighe14@gmail.com”,输入:“google”}

2 个答案:

答案 0 :(得分:1)

您需要使用promises才能使其正常工作。一旦HTTP-Request成功完成,您的scrollBy函数就会被称为异步。以这种方式success在请求完成之前执行 - &gt;所以它仍然是一个空对象return response;。使用AngularJS promises使其正常工作。这是一个简单的工作fiddle example

{}

答案 1 :(得分:-1)

代码未按您期望的顺序运行。 $http需要一段时间才能运行,因此apiCall会在修改之前返回响应。

要解决此问题,您需要使用promise来确保只有拥有所需的所有数据时才运行代码。

此外,从$http返回的数据具有属性data,其中包含调用的结果。

function sendData(postData, url) {
  // subscribe to promise, and add your code in the then block
  apiCall(postData,url)
    .then(function(response) {
      console.log(response.email);
      console.log(response.count);
    });
}

function apiCall(postData, postUrl) {
  // return the promise
  return $http({
    method  : 'POST',
    url     : postUrl,
    data    : postData, 
    headers : {'Content-Type': 'application/json'}
  }).success(function(response) { 
    var result = {};
    for (var attr in response.data) {
      if (response.data.hasOwnProperty(attr)) {
        result[attr] = response.data[attr];
      }
    }  
    return result;   
  });
}

请注意,$ http请求中的data属性保证是原型上没有额外属性的普通对象,因此您不需要hasOwnProperty检查。 apiCall可以简化:

function apiCall(postData, postUrl) {
  // return the promise
  return $http({
    method  : 'POST',
    url     : postUrl,
    data    : postData, 
    headers : {'Content-Type': 'application/json'}
  }).success(function(response) { 
    return response.data;
  });
}