当前位置: 首页 > 面试题库 >

Angular JS:链接承诺和摘要周期

朱刚捷
2023-03-14
问题内容

注意: 小提琴使用的是Angular的旧版本,并且不再起作用,因为从1.2版开始,Angular模板引擎无法透明地处理Promise。

我正在研究链接诺言以填充我的范围,然后让范围自动更新dom。

但是,我遇到了问题。如果我在已经解决的Promise上调用“
then”,它将创建一个新的Promise(它将异步但几乎立即调用成功函数)。我认为问题在于,在调用成功函数时,我们已经离开了摘要周期,因此dom永远不会更新。

这是代码

<div ng-controller="MyCtrl">
    Hello, {{name}}! <br/>
    {{name2}}<br/>
    <button ng-click="go()">Clickme</button><br/>
    {{name3}}
</div>

var myApp = angular.module('myApp',[]);

function MyCtrl($scope, $q) {
    var data = $q.defer();    
    setTimeout(function() {$scope.$apply(data.resolve("Some Data"))}, 2000);
    var p = data.promise;

    $scope.name = p.then(angular.uppercase);
    $scope.name2 = p.then(function(x) { return "Hi "+x;});
    $scope.go = function() {
            $scope.name3 = p.then(function(x) { 
                // uncomment this to make it work:
                //$scope.$apply();
                return "Finally: "+x;
            });
    };
 }

http://jsfiddle.net/QZM4d/

有什么方法可以使此工作在我每次连锁承诺时都无需调用$ apply?


问题答案:

注意 :小提琴使用的是Angular的旧版本,并且不再起作用,因为从1.2版本开始,Angular模板引擎无法透明地处理Promise。

要引用 @ pkozlowski.opensource:

在AngularJS中,承诺解析的结果在$ digest周期内异步传播。因此,仅在进入$ digest循环后才会调用then()注册的回调。

因此,单击该按钮时,我们处于摘要周期。then()创建了一个新的promise,但是then()的结果要到 下一个
摘要周期才会传播,该摘要周期永远不会到来(因为没有$ timeout或$ http或DOM事件来触发它)。如果您用ng-
click添加另一个不执行任何操作的按钮,然后单击该按钮,将导致摘要周期,您将看到结果:

<button ng-click="">Force digest by clicking me</button><br/>

这是一个小提琴。

小提琴还使用$ timeout而不是setTimeout -则不需要$ apply()。

希望您何时需要使用$ apply清楚。有时您确实需要手动调用它。



 类似资料:
  • 问题内容: 我需要创建链式承诺: 如果我将errorCallback放在第一个中,则第二个将被解析,并调用其successCallback。但是,如果我删除了,那么第二个承诺将被拒绝。 根据Angular JS的文档,传播拒绝的唯一方法是返回并且它看起来并不明显,尤其是因为即使不需要它,我也必须注入服务。 也可以通过在中引发异常来完成此操作,但是它将异常跟踪写入控制台,这不好。 还有另一种选择可以

  • 问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()

  • 问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您

  • 问题内容: 我有一个使用$ resource的简单控制器: 我在指令中使用此控制器(在链接功能中) 但是区域是不确定的。调用是异步的,这很逻辑。 我的问题是我该如何等待结果和区域成为包含所有数据的数组? 这里指令的定义 问题答案: 如果要使用异步方法,则需要通过$ promise使用回调函数,示例如下:

  • 问题内容: 我正在做的事情涉及按顺序运行(进行一些设置,然后运行调用者感兴趣的实际命令),然后进行一些清理)。 就像是: 哪里是这样的: 在内部,我使用,它返回,并且有效地将事件的结果从返回给调用者。 现在,我还需要将事件从stdout和stderr发送到调用者,这些事件也来自EventEmitters。是否有一种方法可以使(Bluebird)Promises正常工作,或者它们只是妨碍发出多个事件

  • 问题内容: 遵循方法有效: 4个问题: 1)如果例如不好,我不想执行其余的功能,那我该如何退出(退出,中断,什么,..)? 2)我如何设置其中一些并行,其中一些串行? 3)如何在它们之间传输数据? 4)如何使以下函数从其先前结果中得到依赖? 问题答案: 您在问如何在promise中 链接 功能。 3)如何在它们之间传输数据? 4)如何使以下功能取决于其先前的结果? 返回 链中 下一个函数的数据(或