就像有一个加载 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…</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/