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方法和文字方法在触发回调方面有什么区别?构造函数中附加的测试方法如何触发回调?
你有两处错误:打字错误
result = funesult;
而且您还没有在测试中定义 myModelExample
,所以
myModelExample = new MyModel();
你应该在里面测试 .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();
});
这是一个正在工作的插件:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview
1) MyModel
未在测试中实例化。
2) $rootScope.$apply
和 expect
应该在 promise 回调中
让我们假设一个 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方法和文字方法在触发回调方面有什么区别?构造函数中附加的测试方法如何触发回调?
你有两处错误:打字错误
result = funesult;
而且您还没有在测试中定义 myModelExample
,所以
myModelExample = new MyModel();
你应该在里面测试 .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();
});
这是一个正在工作的插件:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview
1) MyModel
未在测试中实例化。
2) $rootScope.$apply
和 expect
应该在 promise 回调中