如何在AngularJS中将数据从一个异步传递到另一个异步函数

时间:2019-05-09 02:48:39

标签: javascript angularjs angular-promise angularjs-service angularjs-http

如何以角度将全局变量值从一个函数传递给另一个函数?

我有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

来实现

3 个答案:

答案 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)

这两项服务的承诺必须为chained

修改第一个函数以返回承诺:

$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中使用该值时,您需要验证逻辑。