javascript - 在执行操作之前等待 2 个异步 API 调用的结果

标签 javascript angularjs typescript asynchronous

我在页面加载时触发了 2 个异步 API 调用。我将每个返回的值相加,然后计算它们的变化百分比。因此,我需要确保每个 API 都已成功调用,并且在计算差异之前已填充了保存总数的两个变量。

我现在所做的是使用 $watchGroup 来监视这两个变量,并在两个变量都不为 null 时调用该函数。这是我的 Controller 代码:

module Controllers {
    export class MyController {
        static $inject = ["$scope",'$http'];
        public TotalCurrent: any;
        public TotalPrevious: any;
        public diffPercent:any;
        constructor(
            private $scope: ng.IScope,
            private $http: ng.IHttpService,
        ) {
            this.$scope.$watchGroup(['myC.TotalCurrent', 'myC.TotalPrevious'], function (newVal, oldVal, scope) {
                if (newVal[0] != oldVal[0] && newVal[1] != oldVal[1] && newVal[0] != null && newVal[1] != null)
                    scope.myC.diffPercent = scope.myC.GetDifferencePercent(newVal[0], newVal[1]);
            });
                this.GetValuesFromAPI();
        }


        public GetValuesFromAPI() {
            this.TotalCurrent = null;
            this.TotalPrevious= null;


            this.$http.get("url1").then((result: any) => {
                if (result.value.length > 0) {
                    var TempCurrentTotal = 0;
                    for (var i = 0; i < result.value.length; i++) {
                        TempCurrentTotal += result.value[i].Val;
                    }
                    this.TotalCurrent = TempCurrentTotal;
                }

            });

            this.$http.get("url2").then((result: any) => {
                    if (result.value.length > 0) {
                        var TempPreviousTotal = 0;
                        for (var i = 0; i < result.value.length; i++) {
                            TempPreviousTotal += result.value[i].Val;
                        }
                        this.TotalPrevious= TempPreviousTotal;
                    }
                })
        }

        public GetDifferencePercent(current:any, last:any){
            var percentage = ((Math.abs(current - last) / last) * 100).toFixed(2);
            return percentage;
        }
    }
}

目前效果很好。但是,我想知道是否有任何方法可以实现此目的,而不必担心与使用 $watchGroup 相关的性能问题,因为将来 API 调用的数量可能会增加,并且我的页面已$watch 上的其他几个变量。我考虑过使用 .then() 链接 API 调用,但每个 API 的响应时间都非常长,链接它们也会减慢页面速度。有什么建议吗?

最佳答案

您是否考虑过并行启动它们?

您可以使用$q像这样:

const promise1 = this.$http.get("url1");
const promise2 = this.$http.get("url2");

this.$q.all([promise1, promise2]).then(results => {
  // results[0] is the result of the first promise, results[1] of the second.
});

您可以在类构造函数中注入(inject) $q 服务。

当两个 Promise 完成时调用回调。如果需要,您还可以检查错误,只需附加一个 catch 即可。

关于javascript - 在执行操作之前等待 2 个异步 API 调用的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46360188/

相关文章:

javascript - 如何在不重新加载页面的情况下使用 GET 发送变量

javascript - Bootstrap 4 - 我无法在 div 中拉伸(stretch)背景图像

javascript - 如何使回车键作为输入选项卡并在 angularjs 中找到按钮时提交?

angularjs - Protractor - 如何获得第一个或最后一个 CHILD 值

javascript - 隐藏/显示 Ipresso 生成的表单内的内容

javascript - 如何从日期格式angularjs中转义单词

javascript - 带有 AOT 的类型提供者中的 Angular 条件

javascript - 如果月份无效,如何从 DOB 计算年龄?

angular - 多个切换类

javascript - 如何使用另一页面的 Knockout JS 将一个 viewModel 数据传递到其他 ViewModel 函数