用$ watch观看承诺

时间:2015-10-14 18:17:51

标签: javascript angularjs promise watch

我构建了一个具有指向promise的属性的指令。当promise得到解决时,我想运行一个对数据做某事的函数。那样:

 scope.$watch('source', function (dataSource) {
               if( !dataSource ) return ;
               dataSource.then(function ( d ) {
                   dataToView( d );
               });
           });

但有问题。 source可以在很短的时间内更改多次,每次我都会将处理程序注册到当前的承诺 例如,如果source更改3次dataToView(),则调用3次!对于没有任何相关性的承诺。

我真正想要的是在绑定到dataToView()的承诺解决时调用source

谁知道如何解决这个问题?

2 个答案:

答案 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 );
});

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