如何破坏未解决的承诺

时间:2015-06-12 14:06:24

标签: angularjs angular-promise

查看代码段

$scope.getSongs = function(keyword){
     songServices.getSongList(keyword).then(
         function(resp){
             $scope.songList = resp.data.songList;
         }
     );
}

这里getSongList只是通过HTTP请求从服务器返回歌曲列表。

在我的HTML中:

<input auto-focus type="text" placeholder="Enter song ID/Keyword" ng-model="keyword" ng-change="getSongs()">

这里的问题是承诺的行为,有时如果某些承诺需要更多时间(即使在ms。)才能得到解决,那么它会显示错误的数据。当你搜索'AKON'时,让我们说第一次'A'的回复最后返回然后用虚假数据刷新范围,有没有办法停止或丢弃在向服务器发送另一个承诺之前尚未解决的承诺,或者如何我可以处理这种情况。

提前致谢。

3 个答案:

答案 0 :(得分:10)

$ http调用可以通过在'timeout'配置选项中传递promise并解析该promise来取消。

来自the documentation

  

timeout - {number | Promise} - 超时(以毫秒为单位),或承诺在解决时应中止请求。

示例:

var canceler = $q.defer();
$http.get(someUrl, { timeout: canceler.promise });

// later: cancel the http request

canceler.resolve();

答案 1 :(得分:6)

在用户停止输入之前,最好不要进行呼叫,而不是破坏承诺。您可以使用ng-options指令设置去抖动计时器。这样,只有在用户停止输入后才会执行操作。

<input auto-focus type="text" placeholder="Enter song ID/Keyword" ng-model="keyword" ng-change="getSongs" ng-model-options="{ debounce: 500}">

答案 2 :(得分:2)

你可以很容易地从一个普通的承诺中创造一个可破坏的承诺:

var destroyablePromise = function(p) {
  var r = $q.defer();

  p.then(function(a) { if (p) { r.resolve(a); }}, 
         function(a) { if (p) { r.reject(a); }},
         function(a) { if (p) { r.notify(a); }});

  r.promise.destroy = function() {
    p = null;
  };
  return r.promise;
}

Etvoilà!