在执行http get request angularJS时修复竞争条件

时间:2016-03-31 11:56:22

标签: javascript angularjs

我有以下功能,用于检查用户是否输入了正确的密码和用户名。这正常运行,但函数在触发成功/错误函数之前返回。

因此函数总是返回true,这是使函数返回正确值的最佳方法。

SELECT matchinfo(myftstable) FROM myftstable WHERE ...

2 个答案:

答案 0 :(得分:4)

你想要回复承诺。 所以你可以回复你的http电话:

return $http("...");

在您的代码中,您可以使用此返回的承诺来检查它是否是succssful:

loginCheck(u, p).then(function() {
    //success
}, function() {
    // error
});

答案 1 :(得分:0)

你应该对JavaScript Promises做一些研究。这就是你在这里工作的内容。问题是HTTP调用(通常)是异步的,这意味着代码在继续之前不会等待它们完成。这是承诺的来源。

而不是直接返回true / false值,而是应该返回一个表示true / false值的promise。然后,您可以将处理程序函数附加到它基本上说"每当HTTP调用完成时,将结果传递给这些函数。如果您使用的是更新版本的Angular,例如1.4.4+或1.5.x(不确定Angular 2,但可能仍然适用),$http.post()方法无论如何返回一个promise,因此你可以直接返回它。

关键是承诺的.then()方法。这需要2个参数:第一个参数是成功函数,第二个参数是失败函数。所以你应该像这样重写你的代码:

loginCheck: function(username, password) {
  var failed = true;                      

  return $injector.get('$http').post(AUTH_URL,
    {username: username, password: password}, {loginType: "cancel"}
  );
}

// ...

// somwhere else where securityService.loginCheck() is used
securityService.loginCheck(username, password).then(
  // success
  function(data) {
    // handle successful login
  },
  // failure
  function(data, status) {
    // handle failed login
  }
);

这就是现在编写异步代码的方法。绝对阅读Promises和异步概念,它在现代Web开发中非常重要。