javascript - AngularJS:超时 promise 调用

标签 javascript ajax angularjs timeout promise

在我的 AjaxPromiseService.js 工厂中,我一直在尝试将超时机制合并到 Promise 调用中(通常是对远程服务的 $http.get/post 调用)。我目前正在做的方法是在 $timeout 事件和实际的 Promise 调用之间创建一个竞赛。示例代码如下(来自 AngularJS 中我的 AjaxPromiseService.js 工厂的代码):also available in this 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() 最终都会按顺序解析,但是,我想取消 timeoutPromise() 如果 getDummyData() 首先被解析。我想知道如何做到这一点?

最佳答案

$http 有一个 timeout 参数,当 promise 得到解决时,该参数会使请求超时 - 因此,您可以给它一个 $timeout > promise :

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

<强> DEMO

关于javascript - AngularJS:超时 promise 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650908/

相关文章:

javascript - 禁用 v-autocomplete 中的选项

javascript - 即使 json_encode 正确且一切正常,Ajax 请求也始终会引发错误

php - 使用 ajax 时 post 值为 null

javascript - 将对象替换为 AngularJS 中数组中的现有值

javascript - 如何动态获取文本框的值?

php - 表达式引擎 SafeCracker 格式日期选择器

c# - 当属性不为空时使用 FluentValidation 检查电子邮件有效性

php - 使用 php 的 Angular $http 服务未显示数据?

javascript - 剑道格式网格中的数字

php - 没有提交的单选按钮值到mysql