【发布时间】: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;
});
}
-
我调用这个的javascript代码
if (workflowStatus == "Start") { var returnHttp = $paymentFormsService.paymentFormRoleValidationBeforeSubmit(parseInt($rootScope.contractId), parseInt($rootScope.payFormId)); flagValue = returnHttp; } -
在这个 fire 方法中,我正在检查 flagValue 是 true 还是 false,然后执行一些其他任务,但是这个值即将取消定义,else 部分正在执行
setTimeout(fire(workflowStatus, flagValue), 5000);
函数触发(工作流状态,标志值){ 如果(标志值 === 真){ // 如果值为真,则保存在数据库中。 } 别的{ // 这里我在 UI 屏幕上显示一个错误弹出窗口 } }
但在我的情况下,我每次都会弹出错误消息,因为 API 尚未返回值并且 flagValue 未定义。这个弹出窗口会显示出来。之后,API 返回它以异步方式工作的值。
或者有没有其他方法可以更新我。这是我的生产问题。
【问题讨论】:
-
很抱歉听起来颇有争议,但反过来说:您需要 异步 行为,并且必须相应地重组您的应用程序。其他一切都会导致混乱。
-
如果你想发出一个同步的http请求,你需要使用一个原始的XMLHttpRequest。我强烈建议不要这样做。在 javascript 中同步运行任何东西都会使浏览器停止 - 因此,如果您的客人在请求运行时进行任何操作,他的浏览器会警告他并提示他停止该过程。这在用户体验方面太糟糕了。
-
谢谢大家,实际上我已经再次编辑了代码部分,我正在使用一种触发方法来检查“flagValue”变量的值。如果此值为 true,则没有问题,如果为 false,我将在某些弹出窗口中的 UI 屏幕上显示一些错误。所以在这种情况下,每当我输入正确的值时,我都会收到错误弹出窗口,因为 API 尚未返回该值并且“flagValue”是 undefiend 并且执行其他条件。
-
另外,使用
success和error回调已在 Angular 1.6 中被弃用。您的代码并没有真正返回承诺。请改用then,根据$http-documentation。 -
@NikolajDamLarsen :如果我使用 promise 并使用 then 方法,那将是再次异步方式,不是吗?
标签: javascript angularjs