我只是调用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”}
答案 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;
});
}