【问题标题】:How to execute some code only after code from a different file has finished?如何仅在来自不同文件的代码完成后才执行某些代码?
【发布时间】:2019-06-06 14:16:33
【问题描述】:

我正在使用 AngularJS,并且我有一个控制器来处理用户的身份验证。然后我有几个不同的控制器进行 API 调用。这些 API 调用需要在身份验证代码完成后执行。

问题是因为我像下面这样并行加载我的控制器,我什至不知道哪个文件会先加载和执行:

<script type="text/javascript" src="./app/controllers/authController.js"></script>
<script type="text/javascript" src="./app/controllers/softwareController.js"></script>

我认为这意味着需要在包含这些文件之前将标志或承诺(知道身份验证何时完成)声明为全局标志。

但是我不能在文件之外和之前声明承诺,因为我无法将解析函数传递给它(因为验证函数甚至还没有被声明)。

最好的方法是什么?

【问题讨论】:

  • 什么是回调或事件发射 - 监听器?
  • 我认为最好的选择是身份验证控制器在结束时发出一个事件,其他控制器监听它并检查它是否在初始化时完成(如果这些控制器可能在身份验证后加载完成了)。因此,您可以将逻辑放在一个函数中,如果用户通过身份验证并在事件侦听器上调用,该函数会在 init 上调用

标签: javascript angularjs promise es6-promise


【解决方案1】:

为身份验证创建服务并将其注入您的控制器。在您的服务中,添加一个带有成功回调的身份验证函数。将此服务注入您的控制器。在您的控制器中,您可以在成功回调函数中执行登录。

服务

angular.module('app', []).service('authService', function(){
   this.authenticate = function(successCallback) {
      // Perform authentication here
      successCallback();
   }
});

控制器

angular.module('app').controller('firstCtrl', function($scope, authService){
   authService.authenticate(function onSuccess(){
      // Authentication was successful
   });
});

【讨论】:

  • AngularJS 框架及其 $http 服务是基于 promise 的。让authService 返回承诺会更明智。
  • 是的,基于承诺的解决方案更好,并提供更多控制。但是,该问题并未具体说明已发出 http 请求。也许用户只打算验证存储在 cookie 中的信息。
猜你喜欢
  • 2020-11-18
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2018-09-25
  • 2012-02-08
相关资源
最近更新 更多