承诺在服务中取消自己

时间:2016-03-28 20:08:44

标签: javascript angularjs promise angular-promise angular-http

我遇到了Angular(1.4)服务的一些问题。代码大致如下:

    service.retrieveStuffFromServer = function() {
        return httpCallFromServer().then(
            function(data) {
                if (Array.isArray(data)) {
                    return data;
                }
                return [];
            }
        );
    };

我在两个不同的控制器中调用此函数。大多数时候,它按预期工作,但我在这些条件下遇到问题:

  • HTTP调用需要时间来返回数据
  • Controller A调用该服务。
  • 控制器B呼叫该服务。
  • 服务将数据返回给控制器A
  • 取消控制器B中的呼叫。它永远不会执行后的逻辑

我的第一个猜测是略微改变服务,通知任一控制器服务是否已经忙,所以我可以稍后重试,但我不确定这是否是最佳解决方案,所以我&# 39;我正在寻找一些建议。

1 个答案:

答案 0 :(得分:0)

很难说为什么它不仅仅起作用,但可能是httpCall()中的某些内容阻止了在第一个调用完成之前再次进行相同的调用,并且如果发生这种情况则它会拒绝。但是,如果您希望控制器B调用共享来自活动的先前调用的响应,则可以缓存该承诺:

function myFunction() {
   if (!myFunction.promise) {
     myFunction.promise = httpCall()
         .then(function(result) { 
             myFunction.promise = undefined;
             return ...
         }, function(err) {
             myFunction.promise = undefined;
             throw err;
         });
    }
    return myFunction.promise;
 }

只要先前的呼叫仍未解决,这将导致先前呼叫的相同承诺被返回。

使用函数本身的属性作为缓存是一种方便的方法,可以使状态与函数本身保持逻辑关联。您可以使用myFunction范围之外定义的任何变量。