我构建了一个具有指向promise的属性的指令。当promise得到解决时,我想运行一个对数据做某事的函数。那样:
scope.$watch('source', function (dataSource) {
if( !dataSource ) return ;
dataSource.then(function ( d ) {
dataToView( d );
});
});
但有问题。 source
可以在很短的时间内更改多次,每次我都会将处理程序注册到当前的承诺
例如,如果source
更改3次dataToView()
,则调用3次!对于没有任何相关性的承诺。
我真正想要的是在绑定到dataToView()
的承诺解决时调用source
。
答案 0 :(得分:1)
你需要一些可取消的回调, 你可以这样做:
scope.$watch('source', function (dataSource) {
if( !dataSource ) return ;
var currentCallbackId = Date.now();
dataSource.then(function (myId, d ) {
if (myId !== currentCallbackId) {
return;
}
dataToView( d );
}.bind(null, currentCallbackId));
});
说明: 您生成每个回调唯一ID,该回调在调用时知道。 (使用bind将其作为回调的第一个参数传递)
您将最新的回调ID保存在闭包var中(也可以在'this'上)并且在调用回调时,它会检查它是否仍然相关
答案 1 :(得分:0)
我找到了一个最简单的解决方案:
scope.$watch('source.$$state.value', function (data) {
if( !data ) return ;
dataToView( data );
});
确保我不会注册任何内容,但在当前源上完成时获取新数据