将嵌套的承诺返回到父函数

时间:2014-10-17 19:44:24

标签: javascript angularjs promise angular-promise

在大多数angularjs教程中,我看到了promise chain导致更改范围变量。

$http.get(someURL).then(function (value) {
    $scope.someValue = value;
});

是否可以将该值返回到父函数?我尝试过的方法只是返回了另一个承诺。

$scope.test = function(){
    return $http.get(someURL).then(function (value) {
        return value;
    });
};

$scope.test = function(){
    var deferred = $q.defer();
    $http.get(someURL).then(function (value) {
        deferred.resolve(value);
    });
  return deferred.promise;
}

我不想链接另一个承诺,只返回json所以我可以做这样的事情:

<button ng-click='some_vars = test()'>Get ajax</button>
<ul ng-repeat='var in some_vars'>
    <li>{{var.title}}</li>
</ul>

1 个答案:

答案 0 :(得分:3)

IMO这就是你应该怎么做的:

在您的控制器中执行以下操作:

$scope.some_vars=[];
$scope.loadVars = function(){
    $http.get(someURL).success(function (data) {
        $scope.some_vars=data;
    });
};

在您看来,请执行以下操作:

<button ng-click='loadVars()'>Get ajax</button>
<ul ng-if="some_vars.length>0" ng-repeat='var in some_vars'>
    <li>{{var.title}}</li>
</ul>

更容易,对吧?

然而如果您使用1.2.0-rc.3之前的Angular版本。并且您真的想要自动解包承诺(我强烈建议您反对< / strong>),您必须更改模块配置中$parseProvider的设置,如下所示:

.config(function($parseProvider){
  $parseProvider.unwrapPromises(true);
})

Working Example

版本1.2删除了承诺展开,并且已完全弃用版本1.2.0-rc.3。

您可能需要查看此文档:Migrating from Previous Versions

  

$ parse:由于fa6e411d,承诺展开已被删除。它有   自1.2.0-rc.3起被弃用。它无法再打开。二   方法已被删除:

     $parseProvider.unwrapPromises 

     $parseProvider.logPromiseWarnings