javascript - 循环中的 Angular http post

标签 javascript angularjs

我正在尝试按照此处的建议使用 Angular forEach 在循环内使用 Angular http post- Angular HTTP Get on loopAngularjs loop trought $http.post但解决方案不适用于我的情况。 http post 总是返回关于 LifeBenefitTRAD 中最后一项的结果,但我想要循环中每一项的结果。例如如果我在 LifeBenefitTRAD 列表中有 4 个项目,我的 post 方法将执行 4 次但 w.r.t 列表中的第四个项目。 enter image description here执行总是针对最后一个对象发生。请告诉我我在这里做错了什么?-

   $scope.GenerateAllTradQuote = function () {
        var TRADPlanDetails = {};
        console.log(LifeBenefitTRAD);
        //for (var i = 0; i < LifeBenefitTRAD.length; i++) {
        LifeBenefitTRAD.forEach(function (trad) {
           TRADPlanDetails.QuoteName = "TradQuote_" + trad.LifeBenefitValue;
           TRADPlanDetails.LifeBenefitId = trad.LifeBenefitId;
           TRADPlanDetails.LifeBenefitValue = trad.LifeBenefitValue;

            console.log(TRADPlanDetails);

            $http({
                url: key_Url_GenerateTradQuote,
                method: key_String_HttpPost,
               // async: true,
                params: TRADPlanDetails
            }).then(function (result) {
                $scope.TRAD_PlanDetails.TRAD_DisplayFlag = true;
                if (result.data != key_String_Zero) {

                    $scope.TRAD_PlanDetails.TRAD_DisplayMsg = key_Confirm_Successful_Quote;
                }
                else {
                    $scope.TRAD_PlanDetails.TRAD_DisplayMsg = key_Confirm_failed_Quote;
                }
            });
        });
       // }
    };

最佳答案

您正在 forEach 回调的 外部 声明 TRADPlanDetails 变量,这意味着您将相同的对象传递给 $ http 每次。如果在 $http 实际使用您的值之前有一些延迟,那么它最终将对其所有请求使用同一组值。

请尝试每次创建一个新变量和一个新对象:

LifeBenefitTRAD.forEach(function (trad) {
    var planDetails = {
        QuoteName: "TradQuote_" + trad.LifeBenefitValue,
        LifeBenefitId: trad.LifeBenefitId,
        LifeBenefitValue: trad.LifeBenefitValue
    };

    $http({
        url: key_Url_GenerateTradQuote,
        method: key_String_HttpPost,
        // async: true,
        params: planDetails
    })
    // ....
});

如果保持原始请求的顺序很重要,您可以执行以下操作,但请注意这会减慢进程,因为它实际上会等待每个请求完成后再开始下一个请求:

LifeBenefitTRAD.reduce(function (p) {
    var planDetails = {
        QuoteName: "TradQuote_" + trad.LifeBenefitValue,
        LifeBenefitId: trad.LifeBenefitId,
        LifeBenefitValue: trad.LifeBenefitValue
    };

    return p.then(function () {
        return $http({
            url: key_Url_GenerateTradQuote,
            method: key_String_HttpPost,
            // async: true,
            params: planDetails
        });
    })
    .then(function (result) {
        // handle result for current request
    });
}, $q.when());

以上需要使用$q服务。

可能有一种方法可以用 $http 做一些低级的事情,这将允许您在前一个请求即将发出时立即发起一个新请求发送,但据我所知,它没有提供任何可以轻松促进这一点的内容。

关于javascript - 循环中的 Angular http post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28224473/

相关文章:

javascript - ng-touched 不工作-AngularJS

javascript - 使用 Angular 路由时如何升级 Material Design Lite js 组件?

javascript - 如何在带有 scaleTime 的条形图中使用 x 和宽度?

javascript - html setCustomValidity oninvalid 和 oninput 解释

javascript - ant进程中回显文件名

javascript - 正确的格式结构创建变量

javascript - 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

angularjs - 在 AngularJS 中使用 .controller 方法时无法访问 $location

javascript - 如何在textarea中逐行读取并转换为JSON AngularJS

angularjs - 测试失败,因为 AngularJS 没有及时初始化