【问题标题】:Return nested promise to parent function将嵌套的承诺返回给父函数
【发布时间】:2014-10-17 19:44:24
【问题描述】:

在大多数 angularjs 教程中,我看到承诺链会导致更改范围变量。

$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>

【问题讨论】:

  • 不,因为您无法从 AJAX 调用返回 - 您仍然可以将范围变量设置为 AJAX 调用的结果,并且视图将自动更新。
  • @tymeJV 这不是真的,取决于 OP 使用的版本,承诺展开已被弃用,我绝不会建议任何人这样做,但在 Anular 1.2 中仍然可以更改设置的$parseProvider,像这样:$parseProvider.unwrapPromises(true);
  • 在 promise 中嵌入 defer 是一种反模式 github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns 我知道这是在服务器端,但您可以将其作为参考

标签: javascript angularjs promise angular-promise


【解决方案1】:

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>

容易多了,对吧?

但是如果你使用的是 Angular 1.2.0-rc.3 之前的版本。并且你真的想自动解开承诺(我强烈建议你不要这样做),您必须在模块的配置中更改$parseProvider 的设置,如下所示:

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

Working Example

Promise unwrapping 在 1.2 版中被移除,在 1.2.0-rc.3 版中已完全弃用。

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

$parse: 由于 fa6e411d,promise unwrapping 已被移除。它有 自 1.2.0-rc.3 起已弃用。无法再开启。二 方法已被删除:

     $parseProvider.unwrapPromises 

     $parseProvider.logPromiseWarnings

【讨论】:

  • 我知道你可以这样做,但只返回值真的不可能吗?我想避免制作一堆不同的函数来控制如何更新范围,宁愿只在 html 中完成。
  • @BillJohnston 不,这并非不可能,我会在几秒钟内更新我的答案,但我建议你不要这样做。
  • @BillJohnston 我已经更新了我的答案,请看一下,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多