用 $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 );
});

确保我不注册任何内容,而是在当前源上完成时获取新数据