在AngularJS中展开中介服务中的承诺

时间:2015-03-30 12:31:48

标签: javascript angularjs

我正在开发一个Angular app结构,它有一个后端服务可以与Rest API(例如使用Restangular)通信,第二个服务保存多个控制器的状态,最后是控制器。

状态保持服务应该能够展开从Restangular Service返回的promise并将数据提供给控制器。我希望控制器不知道如何接收数据,因为这是服务的责任。这就是控制器不应该打开承诺等的原因。

我的问题如下: 当我在状态保持服务中解包承诺并将其写入变量时,控制器永远不会获得正确的值。但是,当我将其写入JavaScript对象属性时,它最终会在解析promise时更新。任何人都可以向我解释为什么行为上有差异吗?

我的控制器:

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
  }

}

Plunker:http://plnkr.co/edit/A31sscAqCCcmnmHfmSLR

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

2 个答案:

答案 0 :(得分:1)

你在这里遇到了竞争状况。你有2个选择。要么使用带有解析的ui-router,要将已解析的数据注入控制器,要么需要从服务返回promise并等待在控制器中解析的承诺

答案 1 :(得分:0)

您应该为范围变量指定myService.getBackendName1引用,并使用插值指令在UI上调用它。

<强>控制器

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

}

<强> HTML

<body ng-app="myModule">
    <div ng-controller="myModuleController">
        <h1>Hello Plunker!</h1>
        <br /> Doesnt Work backendName1: {{backendName1()}}
        <br /> Works: {{backendName2.name}}
    </div>
</body>

Working Plunkr此处