Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
Angular promise callback not firing inside constructor method, but firing in object literal method
让我们假设一个角度服务封装了一个纯Javascript模型。它有一个简单的异步方法,它使用promise解析返回接收到的相同参数(仅用于演示)。
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
});
构造函数创建的方法和字面方法在触发回调方面有什么区别?构造函数中附加的测试方法如何触发回调?
这是一个Plunker的例子
您有两件事错了:一个打字错误
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
这是一个正在工作的plunker:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview
1) 测试中未实例化MyModel
。2) $rootScope.$apply
和expect
应该在promise回调内部
相关文章:
- 车把.js在数据标记中嵌入文本 json 对象
- 为什么页面方法对象未定义
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 如何使用在另一个文件中定义的JavaScript方法/对象
- KendoUI Mobile ListView/MVM”;对象#<文本>没有方法'getAttrib
- 数组文本作为对象键
- 文本对象到路径:如何从使用Cambam字体的Raphael js中使用打印方法时生成的双路径中删除单个路径
- 在 JavaScript 对象文本中组织方法和属性的最佳方式
- 如何在 JavaScript 中使用继承与构造函数方法一起使用 返回具有私有属性的对象文本
- 如何通过锚文本获取对象
- 将文本从对象追加到文本区域不工作
- $("#id").val()返回dojo的选项文本.filteringselect对象
- 如何告诉JsHint忽略“未解析的函数或方法”?对象上的警告
- 我如何结合用户输入改变文本方法和一个if语句
- 文本区域对象中html标记的Javascript验证
- 对象 #<文本> 类型的内容有哪些方法可用
- 在对象文本方法周围传递异步值
- 如何确保返回对象文本中的方法调用使用预期的“this”
- 使用jinja/javascript动态创建方法/对象
- 隐藏与选择器相同文本的对象的父对象