javascript - $q.all 未按预期工作

标签 javascript angularjs angular-promise

就像有一个加载 div,如果两个 API 调用尚未准备好结果,我想显示它。

这样结果就不会突然跳到 View 中导致其闪烁。

我的观点看起来像这样:

<div ng-show="vm.loading" class="table-overlay table-overlay-loading">
    <div class="table-overlay-content">
        <div class="table-overlay-message">Loading&hellip;</div>
    </div>
</div>
<div ng-show="vm.loadError" class="table-overlay table-overlay-error">
    <div class="table-overlay-content">
        <div class="table-overlay-message"><i class="icon-error-indicator"></i>
            Error encountered. Please try again.
        </div>
    </div>
</div>
<div class="inner" ng-show="!vm.loading && !vm.loadError">
    <div class="info-panel">
        <h3>Current Pricing</h3>
        <p>
            Billing Period:
            <br>
            <em>{{vm.invoiceCoverageStartDate}} to {{vm.invoiceCoverageEndDate}}</em>
            <br>
            <big><b>${{vm.invoiceTotal}}</b>/month</big>
            <br>
            <a href=""><small>(See Details)</small></a>
        </p>
    </div>

填充插值的方法如下所示:

       vm.getCurrentPricingDetails = function(){
            HttpWrapper.send(url1, {"operation":'GET'})
            .then(function(result){
                console.log("Current Pricing Response: ", result);
                vm.invoiceCoverageStartDate = $filter('date')(result.invoice.coverageStartDate, "dd/MM/yyyy");
                vm.invoiceCoverageEndDate = $filter('date')(result.invoice.coverageEndDate, "dd/MM/yyyy");
                vm.invoiceTotal = result.invoice.invoiceTotal;
            }, function(error) {
                console.log("Error: Could not fetch current pricing details", error);
            });
        }


        vm.getProjectedPricing = function(){
            $timeout(function(){
                var selectedPricingMappingObj = dataStoreService.getItems('server');
                selectedPricingMappingObj.forEach(function(item){
                    vm.totalProjectedPricingSum += parseFloat(item.selectedMapping.cost);
                });
                vm.totalProjectedPricingSum = vm.totalProjectedPricingSum.toFixed(2);
            },1000);                                  
        }

但在我的组件 $onInit 方法中,我尝试使用 Promise 解决相同问题。

      vm.$onInit = function() {                
            vm.loading = true;
            vm.loadError = false;
            var currentPricingDetails = vm.getCurrentPricingDetails();
            var projectedPricingDetails = vm.getProjectedPricing();

            $q.all([currentPricingDetails,projectedPricingDetails]).then(function(results) {
                debugger;
                vm.loading = false;
            }, function(error){
                debugger;
                vm.loading = false;
                vm.loadError = true;
            });

但屏幕仍然闪烁,并且 loading div 不显示。

我希望 loading div 显示,直到并且除非两个方法调用未完成结果。`

如何实现这一目标?

我做错了什么?

最佳答案

vm.getCurrentPricingDetails() 和 vm.getProjectedPricing() 不会返回任何内容。所以你的路线

$q.all([currentPricingDetails,projectedPricingDetails])

真的只是

$q.all([undefined, undefined])

$q.all 需要一组 promise 。 $timeout 在完成时返回一个 promise 。看起来你的 HttpWrapper 也返回了一个 promise 。所以我认为您需要做的就是在代码中添加返回:

return HttpWrapper.send(url1, {"operation":'GET'})

return $timeout(function(){

关于javascript - $q.all 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42298908/

相关文章:

javascript - 停止 AngularJS promise 链

node.js - AngularJS 应用程序在本地和 Heroku 上有不同的行为

javascript - 在 AngularJS 服务中缓存 Promise 对象

angularjs - Angular $q .catch() 方法在 IE8 中失败

php - 重新影响 div 使 jquery 表现得很奇怪

javascript - 是否可以像 jQuery 那样通过 id 选择元素?

javascript - 无法读取 null 的属性 'addEventListener'(JavaScript Sails 应用程序)

javascript - 如何访问返回的 Promise 的值?

javascript - 如何降低此 javascript 时间戳生成器函数的复杂性/嵌套 ifs

javascript - 访问包含具有未知属性名称的对象和数组的嵌套数据结构中的数组