【问题标题】:watching promise with $watch用 $watch 观看承诺
【发布时间】:2015-10-19 02:08:19
【问题描述】:

我构建了一个指令,该指令具有该点的属性。当承诺解决时,我想运行一个对数据做某事的函数。像这样:

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

但是有一个问题。 source 可以在很短的时间内多次更改,并且每次我将处理程序注册到当前承诺时。
例如,如果source 更改了 3 次,dataToView() 调用了 3 次!对于不再相关的承诺。

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

有人知道如何解决这个问题吗?

【问题讨论】:

  • 你考虑过使用
    和
    吗?
  • 似乎您正试图以一种意想不到的方式使用 $watch。为什么不直接创建一个名为 setSource 的函数来执行此操作?
  • 显示的概念没有多大意义。显示与此承诺相关的所有代码
  • source 由用户在某些过滤器中进行更改从外部更改。我需要 Promise 而不是实际的数据,因为我在用户等待数据的时候显示 loding 动画

标签: javascript angularjs promise watch


【解决方案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,回调在调用时知道该 ID。 (使用绑定将其作为第一个参数传递给回调)

您将最新的回调 id 保存在闭包变量中(也可以在 'this' 上),当调用回调时,它会检查它是否仍然相关

【讨论】:

  • 我不明白,你应该如何从then 回调中获取myID? then 回调只接受参​​数。
  • 首先看promise是没有意义的
  • @JuanMendes 我正在使用绑定。第一个参数是 this,其他参数作为参数发送给回调...
  • @Bnaya,如果你自己绑定,你怎么会期望myId !== currentCallbackId 是真的?
  • 使用bind的巧妙解决方案。有效解决了各种此类问题。如果我找不到更通用的东西,我会尝试更多地考虑它,并且可能会阅读原生处理 Promise 的 angular#$parse 1.2 以确保我接受你的解决方案
【解决方案2】:

我找到了一个最简单的解决方案:

scope.$watch('source.$$state.value', function (data) {
    if( !data ) return ;
    dataToView( data );
});

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

【讨论】:

  • d 来自哪里?当我在脑海中执行它时它会抛出一个错误:)
猜你喜欢
相关资源
最近更新 更多
热门标签