我遇到了以下问题,我有一个发出 http 请求的服务,当我尝试获取响应时会抛出解析器错误,这是因为响应在尝试解析响应时尚未准备好。
这是代码
simpafAPIservice.getSimulacao($stateParams.id).success(function(response){
console.log(JSON.stringify(response[0].info));
$scope.simuladorInfo.cliente = response[0].cliente;
$scope.simuladorInfo.info = JSON.parse(response[0].info);
console.log(JSON.stringify(response[0].info));
setTimeout(function(){
for(var i=0;i<$scope.simuladorInfo.info.simuladores.length;i++){
$scope.addDataGraphic(i);
}
},100);
});
}
当我控制台时.log响应会打印一个空字符串,这很奇怪,这就是它抛出此解析器错误的原因。
我的问题是,如何仅在响应准备就绪时才执行 .success 功能?
编辑:
最后问题是其他的,我将 JSON 存储在数据库中,但是当 JSON 具有非常信息时,它不会到达 php。
这是我的PHP代码:
<?php
$id = $_POST["id"];
$id_col = $_POST["id_col"];
$tipo = $_POST["tipo"];
$cliente = $_POST["cliente"];
$info = $_POST["info"];
date_default_timezone_set("Europe/Lisbon");
$data = date("Y-m-d H:i:s");
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
if($id!=""){
$sql = "UPDATE `Simulacoes` SET `info`='".$info."' WHERE `id`='".$id."'";
}else{
$sql = "INSERT INTO `Simulacoes`(`id_col`, `tipo`, `data`, `cliente`, `info`) VALUES ('".$id_col."','".$tipo."','".$data."', '".$cliente."', '".$info."')";
}
if ($conn->query($sql) === TRUE) {
echo $info;
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
mysqli_close($conn);
?>
这是我得到的回应:
{"data":"","status":200,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"params":{"id_col":"1","tipo":"Património Reforma","info":{"simuladores":[{"nome":"ii","info":{"prazoReforma":20,"empreendimentos":{"empreendimentos":[{"id":"1","nome":"Oporto Place","localizacao":"Porto","$$hashKey":"object:50"}],"tipologias":{"0":"Loft","19":"T2","37":"T3"},"plantas":{"0":"3.1","1":"6","2":"8","5":"3.2","12":"2.1","13":"7","14":"2.2","15":"5"},"pisos":[{"id":"2","piso":"1","$$hashKey":"object:69"}]},"entrada":"20000","duracao":"35","taxa":"5","montante":82000,"prestacao":"414","prestacao_seguros":"440","renda_liquida":"320","resultado":-120,"patrimonio":134367},"$$hashKey":"object:38","imovel":{"empreendimento":{"id":"1"},"tipologia":"Loft","planta":"3.1","piso":"2","info":{"condominio":"50","renda":"400 ","preco":"102000 ","id":"1"}},"hide":1}],"montanteTotal":134367,"pensao":"569","idadeActual":"45","idadeReforma":"65","pmII":120,"pmTotal":120}},"url":"php/guarda-simulacoes.php","headers":{"Accept":"application/json, text/plain, */*"}},"statusText":"OK"}
如您所见,当我回显$info时,它什么也不返回,一个空字符串,但在 data.config.params 中,我得到了所有参数。有人知道为什么会这样吗?
你的代码看起来不错,这是从 并在其成功中执行代码。我认为您应该使用超时完成后$digest
循环运行的$timeout
而不是setTimeout
法典
simpafAPIservice.getSimulacao($stateParams.id).success(function(response){
console.log(JSON.stringify(response[0].info));
$scope.simuladorInfo.cliente = response[0].cliente;
$scope.simuladorInfo.info = JSON.parse(response[0].info);
console.log(JSON.stringify(response[0].info));
$timeout(function(){
for(var i=0;i<$scope.simuladorInfo.info.simuladores.length;i++){
$scope.addDataGraphic(i);
}
},100);
});
}
根据文档,$http.success 在第一个参数中返回数据,仅当活动转换响应可以检测到是适当的格式时,才会将其转换为 JSON:
Angular 提供以下默认转换:
。
响应转换 ($httpProvider.defaults.transformResponse 和 $http.defaults.transformResponse(:
如果检测到 XSRF 前缀,请将其剥离(请参阅安全注意事项 部分(。如果检测到 JSON 响应,请使用 JSON 解析器。
如果您的服务器使用空字符串进行响应(这里似乎就是这种情况(然后它不会被检测为 JSON 对象,并且将保持为空字符串。
检查您的服务器响应,它可能没有正文和错误状态。如果要从不同的域(即使最终是同一服务器(请求数据,则需要注意的一件事是同源策略。