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

时间:2016-04-12 22:35:07

标签: javascript angularjs constructor promise angular-promise

让我们假设一个封装纯Javascript模型的角度服务。它有一个简单的异步方法,它使用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
});

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

Here is a Plunker with the example

2 个答案:

答案 0 :(得分:1)

你有两个错误:错字

result = funesult;

你还没有在测试中定义myModelExample,所以

myModelExample = new MyModel();

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

答案 1 :(得分:-1)

这是一个工作的掠夺者:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview

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