用 $watch 观看 promise
watching promise with $watch
我构建了一个指令,该指令具有指向 promise 的属性。当 promise 解决时,我想 运行 一个函数来处理数据。像那样:
scope.$watch('source', function (dataSource) {
if( !dataSource ) return ;
dataSource.then(function ( d ) {
dataToView( d );
});
});
但是有一个问题。 source
可以在很短的时间内更改多次,每次我注册一个处理程序到当前的承诺。
例如,如果 source
更改了 3 次 dataToView()
调用了 3 次!对于不再相关的承诺。
我真正想要的是在绑定到 source
的承诺已解决时调用 dataToView()
。
有人知道如何解决吗?
您需要某种可取消的回调,
你可以这样做:
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,回调知道它何时被调用。 (使用将其作为第一个参数传递给回调的绑定)
您将最新的回调 ID 保存在闭包变量中(也可以在 'this' 上),当回调被调用时,它会检查它是否仍然相关
我找到了一个最简单的解决方案:
scope.$watch('source.$$state.value', function (data) {
if( !data ) return ;
dataToView( data );
});
确保我不注册任何内容,而是在当前源上完成时获取新数据
我构建了一个指令,该指令具有指向 promise 的属性。当 promise 解决时,我想 运行 一个函数来处理数据。像那样:
scope.$watch('source', function (dataSource) {
if( !dataSource ) return ;
dataSource.then(function ( d ) {
dataToView( d );
});
});
但是有一个问题。 source
可以在很短的时间内更改多次,每次我注册一个处理程序到当前的承诺。
例如,如果 source
更改了 3 次 dataToView()
调用了 3 次!对于不再相关的承诺。
我真正想要的是在绑定到 source
的承诺已解决时调用 dataToView()
。
有人知道如何解决吗?
您需要某种可取消的回调, 你可以这样做:
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,回调知道它何时被调用。 (使用将其作为第一个参数传递给回调的绑定)
您将最新的回调 ID 保存在闭包变量中(也可以在 'this' 上),当回调被调用时,它会检查它是否仍然相关
我找到了一个最简单的解决方案:
scope.$watch('source.$$state.value', function (data) {
if( !data ) return ;
dataToView( data );
});
确保我不注册任何内容,而是在当前源上完成时获取新数据