AngularJS:超时承诺调用



在我的AjaxPromiseService.js工厂中,我一直在尝试将超时机制合并到promise调用中(通常是对远程服务的$http.get/post调用)。我目前的做法是在$timeout事件和实际承诺电话之间创造一场竞赛。示例代码如下(来自我在 AngularJS 中的AjaxPromiseService.js工厂的代码):也可在此 plnkr 中使用

var timeoutObj = {"isTimeout": true};
function timeoutPromise(deferredObj) {
      $timeout(function() {
        console.log("promise timeout");
        deferredObj.resolve(timeoutObj);
        }, timeoutLimit); // timeoutLimit is in milisecond
    }
//promise calls (e.g. $http.get())
function getDummyData(milisec) {
      var data = {"data" : "dummy data from ajax!"};
      var deferred = $q.defer();
      timeoutPromise(deferred); //start the race to see who resolves first
      //use $timeout to mimick an AJAX call
      $timeout(function() {
        deferred.resolve(data);
        $timeout.cancel(timeoutPromise(deferred)); //not working, how to cancel the race here?
      }, milisec); //
      return deferred.promise;
    } //getDummyData

这似乎有效,如果在指定的持续时间内未解决getDummyData()timeoutPromise()将返回有用的标志,以便我可以让 AJAX 调用正常失败。timeoutPromise()getDummyData()最终将按顺序解决,但是,如果首先重新解决getDummyData(),我想取消timeoutPromise()。我想知道如何做到这一点?

$http有一个timeout参数,当一个承诺被解析时,请求会超时 - 所以,你可以给它一个$timeout的承诺:

getData: function(input, timeout){
  var timeoutPromise = timeout ? $timeout(function(){}, timeout) : null;
  return $http({url: "/some/url",
                timeout: timeoutPromise,
                method: "GET"
               }).then(function(response){
                  var data = response.data;
                  // do something with data, if needed
                  return data;
               });
}

演示

如果您使用的是$http,则有一个更简单的选择。使用$http配置对象的超时属性,$timeout服务:

var requestTimeout = $timeout(function() {}, 4000);
$http({ method:'GET', url:'...', timeout: requestTimeout});
requestTimeout.then(function() {
   console.log ('request aborted - timed out!');
});

当请求在超时期限内成功时,$timeout将自动中止。

根据$http文档$http配置timeout 属性接受承诺,即以毫秒为单位的数字

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

因此,解决方案很简单:

function getData () {
    return $http.get(someUrl, {timeout: 3000});  // adjust the value to what you need
}

相关内容

  • 没有找到相关文章

最新更新