【问题标题】:Need synchronous behavior in angular js 1.x在 Angular js 1.x 中需要同步行为
【发布时间】:2017-12-09 19:29:37
【问题描述】:

背景:我有一个带有 GET 方法并返回布尔值的 Web API。 收到此值后,我需要执行一些操作。

问题:我的代码达到了在 API 返回值之前检查此布尔值的条件。我无法等到 API 返回值。在下面的代码中,Javascript 执行到达“setTimeout”语句。

我的研发:我已应用此 setTimeout 来延迟执行,但该值仍然来自 api 并且 javascript 正在处理中。

代码:使用 AngularJS 1.6 版本 我已经尝试过使用 $http.get() 和 $http({//setting the confiuration here});

实际代码: 1. 调用服务的代码

paymentFormRoleValidationBeforeSubmit: function (contractId, payFormId) {
        return $http({
            url: 'some api url',
            method: "GET",
            headers: serviceheader,
            config: serviceconfig
        }).success(function (data, status, headers, serviceheader) {
            return data.value;
        }).error(function (data, status, header, serviceheader) {
                console.log("** Fail -- before submitting role checked is failed.")
                return false;
        });
    }
  1. 我调用这个的javascript代码

    if (workflowStatus == "Start") {
            var returnHttp = $paymentFormsService.paymentFormRoleValidationBeforeSubmit(parseInt($rootScope.contractId), parseInt($rootScope.payFormId));
                        flagValue = returnHttp;
                    }
    
  2. 在这个 fire 方法中,我正在检查 flagValue 是 true 还是 false,然后执行一些其他任务,但是这个值即将取消定义,else 部分正在执行

    setTimeout(fire(workflowStatus, flagValue), 5000);

    函数触发(工作流状态,标志值){ 如果(标志值 === 真){ // 如果值为真,则保存在数据库中。 } 别的{ // 这里我在 UI 屏幕上显示一个错误弹出窗口 } }

但在我的情况下,我每次都会弹出错误消息,因为 API 尚未返回值并且 flagValue 未定义。这个弹出窗口会显示出来。之后,API 返回它以异步方式工作的值。

或者有没有其他方法可以更新我。这是我的生产问题。

【问题讨论】:

  • 很抱歉听起来颇有争议,但反过来说:您需要 异步 行为,并且必须相应地重组您的应用程序。其他一切都会导致混乱。
  • 如果你想发出一个同步的http请求,你需要使用一个原始的XMLHttpRequest。我强烈建议不要这样做。在 javascript 中同步运行任何东西都会使浏览器停止 - 因此,如果您的客人在请求运行时进行任何操作,他的浏览器会警告他并提示他停止该过程。这在用户体验方面太糟糕了。
  • 谢谢大家,实际上我已经再次编辑了代码部分,我正在使用一种触发方法来检查“flagValue”变量的值。如果此值为 true,则没有问题,如果为 false,我将在某些弹出窗口中的 UI 屏幕上显示一些错误。所以在这种情况下,每当我输入正确的值时,我都会收到错误弹出窗口,因为 API 尚未返回该值并且“flagValue”是 undefiend 并且执行其他条件。
  • 另外,使用 successerror 回调已在 Angular 1.6 中被弃用。您的代码并没有真正返回承诺。请改用then,根据$http-documentation。
  • @NikolajDamLarsen :如果我使用 promise 并使用 then 方法,那将是再次异步方式,不是吗?

标签: javascript angularjs


【解决方案1】:

我认为你应该在你的服务中执行你的 http 请求,并在你调用服务的地方得到你的承诺。这样你就可以在你的 http 调用返回一个承诺时设置你的标志。

服务

paymentFormRoleValidationBeforeSubmit = function (contractId, payFormId) {
    var request = $http({
        url: 'some api url',
        method: "GET",
        headers: serviceheader,
        config: serviceconfig
    });
    return request;
}

调用服务的代码

var promiseGet = $paymentFormsService.paymentFormRoleValidationBeforeSubmit(parseInt($rootScope.contractId), parseInt($rootScope.payFormId));;
promiseGet.then(function (returnHttp) {
    flagValue = returnHttp;
},
function (errorPl) {

});

【讨论】:

  • 很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2019-02-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
相关资源
最近更新 更多