在angularJS中加载数据表之前如何解析http响应?

o2rvlv0m  于 2023-02-03  发布在  Angular
关注(0)|答案(1)|浏览(117)

在下面的代码中,首先我调用一个服务来做一个http请求.
然后使用这个响应创建一个稍后使用的Map。
接下来,在数据表中调用一个新的http请求,并在显示数据之前使用上面的map做一些操作。
问题:我知道$http需要一些时间才能获得响应。我正在尝试使用promise,但失败了。请建议我如何使用promise,以便在第二个http调用之前解析第一个http并创建Map。

//Call to service to do a http call
    MasterServices.getAllCustomers().then(function(result) {
            $scope.resultdata= result.data;
            $scope.resultdata.forEach(element => {
            //creating map holding id, name
            $scope.oumap.set(element.companyId,element.companyName)
            });
        });
    
    //Setting Data-Table
    vm.dtOptions = DTOptionsBuilder.fromFnPromise(function() {
        var defer = $q.defer();
        
        //Calling http call to get some configuration data
        MasterServices.getCompConfig().then(function(result) {
            
            angular.forEach(result.data,function(val){
                if($scope.oumap.has(val.compId)){
                    val.companyName=$scope.oumap.get(val.compId);
                }else{
                    val.companyName=" ";
                }
            });
            defer.resolve(result.data); 
        });
        return defer.promise;
    }).withPaginationType('full_numbers').withOption('createdRow', createdRow);
xxhby3vn

xxhby3vn1#

根据您的目标ecmascript版本,如果您以async-await的形式编写,这将简单得多。

// You may need to use a try-catch to account for the http request failing
const result = await MasterServices.getAllCustomers();
$scope.resultdata = result.data;
$scope.resultdata.forEach(element => {
    //creating map holding id, name
    $scope.oumap.set(element.companyId,element.companyName)
});

// Http response is complete, continue doing other things.

如果由于某种原因无法使用上述方法,则需要将代码的“设置数据表”部分放在第一个承诺的成功回调中。

相关问题