Angular promise 回调不在构造函数内部触发,而是在对象字面量方法中触发

Angular promise callback not firing inside constructor method, but firing in object literal method

让我们假设一个 angular 服务封装了一个纯 Javascript 模型。它有一个简单的异步方法,returns 使用 promise resolve 接收的相同参数(仅用于演示)。

angular.module('app', [])
  .factory('MyModel', ['$q', function ($q) {
    function MyModelConstructor() {
      this.test = function(myParam) {
        var deferred = $q.defer();
        if (myParam) {
          // Not triggering then callback
          deferred.resolve(myParam);
        }
        return deferred.promise;
      }
    }

    return MyModelConstructor;
  }]);

调用测试方法后,一直没有触发回调。但是,如果我将测试方法作为文字附加到构造函数创建的对象,一切正常:

it('should not fail!!!', function() {
  myModelExample = new MyModel();
  var result;
  expect(result).toBeUndefined();
  myModelExample.test(111).then(function(funresult) {
    result = funesult;
  });
  $rootScope.$apply();
  expect(result).toBe(111); // But it fails
});

it('should have working promise', function() {
  myModelExample = new MyModel();
  var result;
  expect(result).toBeUndefined();
  myModelExample.test = function(myParam) {
    var deferred = $q.defer();
      if (myParam) {
        deferred.resolve(myParam);
      }
      return deferred.promise;
  }
  myModelExample.test(111).then(function(funresult) {
    result = funresult;
  });
  $rootScope.$apply();
  expect(result).toBe(111); // This way does not fail
});

constructor created方法和文字方法在触发回调方面有什么区别?构造函数中附加的测试方法如何触发回调?

Here is a Plunker with the example

你有两处错误:打字错误

result = funesult;

而且您还没有在测试中定义 myModelExample,所以

myModelExample = new MyModel();

Plnkr:http://plnkr.co/edit/YdsuoJMkrccPjMb3e2jC?p=preview

你应该在里面测试 .then 已经开火了。 .then$rootScope.apply()

上触发
  it('should not fail but it fails!!!', function() {
    var result;
    myModelExample = new MyModel();
    expect(result).toBeUndefined();

    myModelExample.test(111).then(function(funresult) {
      result = funresult;
      expect(result).toBe(111); // NOPE :(
    });

    $rootScope.$apply();

  });

Plnkr:http://plnkr.co/edit/UWBvHorznTdPHrsxA2Hb?p=preview

这是一个正在工作的插件:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview

1) MyModel 未在测试中实例化。 2) $rootScope.$applyexpect 应该在 promise 回调中