我有2个全局变量:
try
{
//some code here
}
catch(Exception ex)
{
string guid = Guid.NewGuid().ToString();
Dictionary<string,string> dt = new Dictionary<string, string>();
dt.Add("my error number1", guid);
telemetryClient.TrackException(ex,dt);
return BadRequest("Unknown error:"+guid);
}
我有2个角度函数,如下所示:
$scope.genewtId = null;
$scope.data1 = null;
当我将$scope.getID = function() {
Service1.getId("abc").then(function(response){
$scope.genewtId = response.data[0].Id;
console.log($scope.genewtId);
}, function(error){
console.log(error.statusText);
});
};
$scope.getDetails = function() {
Service2.getDetails($scope.genewtId).then(function(response){
// here response is having an error
$scope.data1 = response.data;
console.log($scope.data1.toString());
}, function(error){
console.log(error.statusText);
});
};
的值从一个函数传递给另一个函数时,出现错误
消息:“无法将类型'java.lang.String'的值转换为必需的类型'java.lang.Integer';嵌套的异常是java.lang.NumberFormatException:对于输入字符串:“ null””
但是,$scope.genewtId
返回值console.log($scope.genewtId);
,这意味着它不为空。
请建议是否可以使用787651
答案 0 :(得分:1)
我能想到的唯一原因是因为asynchronous
的{{1}}调用。发生了什么事:
不知何故,您在promises
的承诺完成后已设置Service2.getDetails($scope.genewtId)
的值之前调用$scope.genewtId
,因此该值仍为Service1.getId("abc").then
尝试:
null
即使这种方法可行,我也强烈建议您以更好的方式实现函数调用,因为$scope.getID = function(isCalledAfterDetails) {
Service1.getId("abc").then(function(response){
$scope.genewtId = response.data[0].Id;
console.log($scope.genewtId);
if(isCalledAfterDetails && $scope.genewtId !== null){
$scope.getDetails();
}
}, function(error){
console.log(error.statusText);
});
};
$scope.getDetails = function() {
if($scope.genewtId === null){
$scope.getID(true);
}else{
Service2.getDetails($scope.genewtId).then(function(response){
// here response is having an error
$scope.data1 = response.data;
console.log($scope.data1.toString());
}, function(error){
console.log(error.statusText);
});
}
};
依赖于$scope.getDetails()
来设置$scope.getID()
的值。
如果您想提出实施建议,请用用例和更多代码更新问题
$scope.genewtId
在 service.js
中$scope.getID = function() {
Service1.getId("abc").then(function(response){
$scope.genewtId = response.data[0].Id;
$scope.getDetails();
}, function(error){
console.log(error);
});
};
$scope.getDetails = function() {
Service2.getDetails($scope.genewtId).then(function(response){
// here response is having an error
$scope.data1 = response.data;
console.log($scope.data1.toString());
}, function(error){
console.log(error.statusText);
});
};
controller.js
getDetails = function(id){
var deferred = $q.derfer();
$http.get('/user/'+id).then(function(response){
var newId = response.data[0].Id;
$http.get('/user/details'+newId).then(function(details){
deferred.resolve(details)
})
})
return deferred.promise;
}
答案 1 :(得分:1)
修改第一个函数以返回承诺:
$scope.getID = function() {
return Service1.getId("abc").then(function(response){
$scope.genewtId = response.data[0].Id;
console.log($scope.genewtId);
return response.data[0].Id;
}, function(error){
console.log(error.statusText);
throw error;
});
};
修改第二个函数以既返回承诺又接受参数:
$scope.getDetails = function(id) {
var genewtID = id || $scope.genewtId;
return Service2.getDetails(genewtId).then(function(response){
$scope.data1 = response.data;
console.log($scope.data1.toString());
return response.data;
}, function(error){
console.log(error.statusText);
throw error;
});
};
然后chain这两个承诺:
var promise = $scope.getId();
var promise2 = promise.then(function(id) {
return $scope.getDetails(id);
});
var promise2.then(function(data) {
console.log(data);
}).catch(function(error) {
console.log(error);
});
通过使用.then
承诺的getId
方法,代码在向id
发出请求之前,等待getDetails
值从服务器到达。
由于调用promise的.then
方法会返回新的派生promise,因此很容易创建promise的promise。可以创建任意长度的链,并且由于一个承诺可以用另一个承诺来解决(这将进一步推迟其解决方案),因此可以在链中的任何点处暂停/推迟对这些承诺的解决。
有关更多信息,请参见
答案 2 :(得分:0)
似乎异常来自服务器端。
无法将类型“ java.lang.String”的值转换为必需的类型 'java.lang.Integer';嵌套异常为 java.lang.NumberFormatException:对于输入字符串:“ null”
由于console.log(error.statusText);
在API中使用该值时,您需要验证逻辑。