如何判断请求/承诺是否需要超过5秒才能完成,角度js

时间:2016-05-12 17:25:21

标签: javascript angularjs promise angular-promise

我是一名新开发人员,我正在尝试检查5秒后是否仍未解决承诺。在没有创建新指令/服务/工厂的情况下,最可读的方法是什么?这是我尝试过的,我的主要问题是,我是否在实例化promise变量时在正确的时间设置间隔?

  $scope.promiseTimeLimit = false;
      //if the promise does not return within 5 seconds, show a "service down" warning.
      var promise = service.checkValidRailCar($scope.railcar.number, $scope.railcar.initials);

      $interval(function () {
        $scope.promiseTimeLimit = true
      }, 5000)

      if ($scope.promiseTimeLimit) {
        $scope.message = {
          content: [{
            title: '',
            msg: 'The Service Is Down'
          }],
          type: 'error'
        };
        return;
      }
      promise.then(function (data) {
        if (!data.valid) {
          $scope.invalidData = true;
          $scope.message = {
            content: [{
              title: '',
              msg: 'Invalid: This is not a valid data and can not be created.'
            }],
            type: 'error'
          };
        } else {
          $scope.invalidData = false;
        }
      })

2 个答案:

答案 0 :(得分:1)

是的,您在实例化promise后正确设置了时间间隔。但是,我认为你不想在这里使用$interval。您可能想要使用$timeout。除非您清除$interval,否则将一次又一次地调用$interval中的回调函数。 $timeout中的回调函数只会被调用一次。如果您只想检查一次是否在5秒内解决了承诺,则应使用$timeout

第二件事是关于以下代码:

if ($scope.promiseTimeLimit) {
    $scope.message = {
      content: [{
        title: '',
        msg: 'The Service Is Down'
      }],
      type: 'error'
    };
    return;
}

您需要将此代码保留在$ timeout函数内。为了更好地理解,我将变量名称$scope.promiseTimeLimit更改为$scope.promiseComplete并将其初始化为$scope.promiseComplete = false

$timeout(function () {
    if(!$scope.promiseComplete) {
        $scope.message = {
          content: [{
            title: '',
            msg: 'The Service Is Down'
          }],
          type: 'error'
        };
     }
}, 5000);

然后,在promise.then函数(解析)中,您需要将$scope.promiseComplete设置为true。

promise.then(function (data) {
    $scope.promiseComplete = true;
    if (!data.valid) {
      ...
})

那么,这里发生了什么? $ timeout回调函数将在5秒后或之后调用。它将检查$scope.promiseComplete是否为假。如果为false,则生成警告消息。如果是真的,什么也不做。在promise.then中,我们将$scope.promiseComplete设置为true。因此,如果promise.then函数(resolve)在调用$ timeout回调函数之前将$scope.promiseComplete设置为true,则表示promise在5秒之前完成。

我已经创建了一个样本plunker来理解这种行为。您可以查看HERE

答案 1 :(得分:0)

恕我直言,承诺超时应该被实施为拒绝,并且像宣传一样,应该在尽可能低的水平上实施。

事实上,异步超时实际上是种族window.setTimeout()与您要调用的任何异步服务方法的默认值。

你可以这样写,例如:

service.checkValidRailCarWithTimeout = function(t, railcarNumber, railcarInitials) {
    // range checks
    if(t === undefined || railcarNumber === undefined || railcarInitials === undefined) {
        return $q.reject(new RangeError('Invalid parameter(s)'));
    }
    // race - timeout versus service call
    return $q(function(resolve, reject) {
        var tRef = window.setTimeout(function() {
            reject(new Error('The Service Is Down');
        }, t);
        function kill() {
            window.clearTimeout(tRef);
        };
        service.checkValidRailCar(railcarNumber, railcarInitials).then(resolve, reject).then(kill, kill);
    });
};

请致电如下:

var promise = service.checkValidRailCarWithTimeout(5000, $scope.railcar.number, $scope.railcar.initials).then(function(data) {
    $scope.invalidData = !data.valid;
    if (!data.valid) {
        throw new Error('Invalid: This is not a valid data and can not be created.');
    }
}).catch(function(error) {
    $scope.message = {
        content: [{
            title: '',
            msg: error.message
        }],
        type: 'error'
    };
});

注意:

  • $scope.promiseTimeLimit的需求消失
  • kill()并非绝对必要,但通过清除失去种族的潜在时间来保持清洁。
  • $scope.message = ...表达式将显示error
  • 发送的任何邮件