超时处理程序返回angularjs中的数据

时间:2017-06-29 11:59:11

标签: javascript angularjs promise timeout angular-promise

基于this answer我正在尝试创建一个服务,即使请求未成功但超时也会返回数据。

this.getStatus = function()
    {
        var timeoutPromise = $timeout(function () {
            canceler.resolve();
            console.log("Timed out");
        },250);

        var canceler = $q.defer();

        $http.get("data.js", {timeout: canceler.promise} ).success(function(data){
          console.log(data);

          $timeout.cancel(timeoutPromise);

          return data;
        });
    };

这是带有$http请求的服务的名称

var promises = [
    firstService.getStatus(),
    secondService.getStatus(),
    thirdService.getStatus()
];

$q.all(promises)
   .then(function (serviceResults) {
        //process Data in case of success
        console.log("Result First Service: "+ serviceResults[0]);
        console.log("Result Second Service: "+ serviceResults[1]);
        console.log("Result third Service: "+ serviceResults[2]);
    })
    .catch(function() {
        //process Mock data in case of Failure
    });

如果请求成功,它应返回响应中的数据,如果超时,则返回一些占位符数据 那么如果请求超时,如何返回数据呢?

1 个答案:

答案 0 :(得分:0)

你可以:

this.getStatus = function()  {
    var deferred = $q.defer();
    var timeoutPromise = $timeout(function () {
        deferred.resolve(
          // MOCKED DATA HERE
        );
        console.log("Timed out");
    }, 250);

    $http.get("data.js", {timeout: canceler.promise} ).then(function(data){
      $timeout.cancel(timeoutPromise);
      deferred.resolve(data);
    }).catch(deferred.reject);

    return deferred.promise;
};

这样,如果请求成功,它将使用响应数据解析。如果超时,它将使用模拟数据解析。如果在超时之前发生了另一个错误,它会拒绝带有响应错误的promise。