相关疑难解决方法(0)

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

注意:小提琴使用旧版本的Angular,并且它不再起作用,因为从1.2开始,Angular模板引擎不会透明地处理promises.

我正在寻找链接承诺来填充我的范围,然后让范围自动更新dom.

我遇到了这方面的问题.如果我在已经解决的承诺上调用"then",它会创建一个新的承诺(它将异步调用成功函数,但几乎立即调用).我认为问题是我们已经在调用成功函数时离开了摘要周期,所以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;
            });
    };
 }
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/QZM4d/

是否有某种方法可以在每次连接承诺时都不用调用$ apply来完成这项工作?

promise angularjs

15
推荐指数
1
解决办法
1万
查看次数

AngularJs单元测试 - 模拟承诺不执行"然后"

我们对我们的控制器进行单元测试.我们已成功模拟对REST服务层的调用,并验证它确实是使用给定数据调用的.然而,现在我们想在我们的控制器中测试thenpromise 的执行会改变location.path:

控制器:

(function () {

    app.controller('registerController', ['$scope', '$location', '$ourRestWrapper', function ($scope, $location, $ourRestWrapper) {

    $scope.submitReg = function(){
        // test will execute this
        var promise = $ourRestWrapper.post('user/registration', $scope.register);

        promise.then(function(response) {    
                console.log("success!"); // test never hits here           
                $location.path("/");
        },
            function(error) {
                console.log("error!"); // test never hits here
                $location.path("/error");
            }
        );
    };
Run Code Online (Sandbox Code Playgroud)

$ourRestWrapper.post(url,data)只是包裹Restangular.all(url).post(data)..

我们的测试:

(function () {

    describe("controller: registerController", function() {

        var scope, location, restMock, controller, q, deferred;

        beforeEach(module("ourModule"));

        beforeEach(function() {
            restMock = {
                post: …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing mocking promise angularjs

11
推荐指数
1
解决办法
4296
查看次数

标签 统计

angularjs ×2

promise ×2

javascript ×1

mocking ×1

unit-testing ×1