javascript - 在 AngularJS 的中介服务中解开 Promise

标签 javascript angularjs

我正在开发一个 Angular 应用程序结构,它有一个后端服务来与 Rest API(例如使用 Restangular)通信,第二个服务保存多个 Controller 的状态,最后保存 Controller 的状态。

状态持有服务应该能够解开从 Restangular 服务返回的 promise 并将数据提供给 Controller 。我希望 Controller 不知道如何接收数据,因为这是服务的责任。这就是为什么 Controller 不必解开 promise 之类的原因。

我的问题如下: 当我在状态保存服务中解开 promise 并将其写入变量时, Controller 永远不会获得正确的值。然而,当我将其写入 JavaScript 对象属性时,它最终会在 promise 解决时更新。谁能向我解释为什么行为不同?

我的 Controller :

function myModuleController($scope, myService) {
  $scope.backendName1 = myService.getBackendName1();
  $scope.backendName2 = myService.getBackendName2();

}

我的中介服务:

function myService(myBackendService) {
  var backendName = '';

  var backendObject = {
    name:''
  }

  function getBackendName1() {
    myBackendService.getBackendName().then(
      function(value) {
        backendName = value;
      }
    )
    return backendName;
  }

  function getBackendName2() {
    myBackendService.getBackendName().then(
      function(value) {
        backendObject.name = value;
      }
    )
    return backendObject;
  }

  return {
    backendName: backendName,
    getBackendName1: getBackendName1,
    getBackendName2: getBackendName2
  }

}

骗子:http://plnkr.co/edit/A31sscAqCCcmnmHfmSLR

问题是 getBackendName1 没有得到解决, 当 getBackendName2 正在解析时。请参阅 Plunker 进行演示。

最佳答案

您在这里面临竞争条件。你有两个选择。要么使用 ui-router 进行解析,并将解析的数据注入(inject) Controller ,要么您需要从服务返回 promise 并等待 promise 在 Controller 中解析

关于javascript - 在 AngularJS 的中介服务中解开 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29346337/

相关文章:

javascript - 除非将鼠标悬停在某个元素上,否则防止失去焦点

javascript - 将历史记录属性传递给包装在父组件中的动态创建的路由

javascript - CSS 中的图像路径在开头添加 '/'(即斜杠)

javascript - jQuery 使图像弹出在随机位置不起作用

javascript - 单击按钮使用angularjs将文本复制到另一个div

javascript - Angularjs 并使用包含 __proto__ 的数组进行选择

javascript - Angular HTTP Get 循环

javascript - 在 ng-click 上发送文本框输入

javascript - Redis递归:超出最大调用堆栈大小

javascript - AngularJS $http 不返回整个 Select 语句