2017-03-02 66 views
1

我只是調用api返回josn編碼數據並試圖打印對象屬性,但顯示未定義,但是當我打印該對象時,該對象具有該屬性和值。 「sameerdighe14 @ gmail的:在javascript中訪問對象屬性的問題顯示未定義?

我的代碼基於

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); 
?> 

控制檯

對象{電子郵件響應數據。 com「,輸入:」google「}

+0

請添加您的回覆數據。 – lin

+0

當你已經在做'(var attr in data)'時,你真的需要這行'if(data.hasOwnProperty(attr))'嗎? – brk

+0

@brk它檢查屬性,如果有空字段的屬性,那麼它不會將它分配給其他對象。 – SaMeEr

回答

1

您需要使用promise來使其工作。一旦HTTP請求成功完成,你的success函數就被稱爲異步。這樣return response;在請求完成之前執行 - >因此它仍然是一個空對象{}。使用AngularJS promises使其工作。這是一個簡單的工作fiddle example

function sendData(postData, url){ 

    var filteredData = {}; 

    apiCall(postData,url).then(function (response) { 

     for (var attr in response.data) { 
      if (response.data.hasOwnProperty(attr)) { 
       filteredData[attr] = response.data[attr]; 
      } 
     } 

     console.log(filteredData.email); 
     console.log(filteredData.count); 
    }); 
} 


function apiCall(postData, postUrl){ 
    return $http({ 
     method : 'POST', 
     url  : postUrl, 
     data : postData, 
     headers : {'Content-Type': 'application/json'} 
    }); 
} 
+0

我仍然有同樣的問題。打印在控制檯中未定義 – SaMeEr

+0

Ohh爲我工作。 – SaMeEr

+0

但仍計數不工作@lin – SaMeEr

-1

該代碼沒有以您期望的順序運行。 $http需要時間才能運行,因此apiCall在修改前會返回響應。

要解決此問題,您需要使用承諾來確保代碼只在您擁有所需的所有數據時才能運行。

此外,從$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; 
    }); 
} 
+0

這是行不通的。 '。然後(功能(響應)''持有$ http'而不是成功的部分 – lin

+0

'success'返回一個承諾因此,任何修改都保持返回的數據源的原始回調數據:。https://開頭的github .COM /角/ angular.js/BLOB/3a3db690a16e888aa7371e3b02e2954b9ec2d558/src目錄/ NG/http.js#L910 – iblamefish

+0

沒錯,但這個承諾是處理成功的承諾本身。請檢查https://github.com/angular/angular。 JS/BLOB/3a3db690a16e888aa7371e3b02e2954b9ec2d558/src目錄/ NG/http.js#L415&http://jsfiddle.net/5uancso0/ – lin