当前位置: 首页 > 面试题库 >

当承诺被拒绝时,AngularJS服务重试

东弘扬
2023-03-14
问题内容

我从控制器内部的异步服务获取数据,如下所示:

myApp.controller('myController', ['$scope', 'AsyncService',
function($scope, AsyncService) {
    $scope.getData = function(query) {
        return AsyncService.query(query).then(function(response) {
            // Got success response, return promise
            return response;
        }, function(reason) {
            // Got error, query again in one second
            // ???
        });
    }
}]);

我的问题:

  1. 当我从服务中获得错误而又不返回承诺时,如何再次查询服务。
  2. 在我的服务中这样做会更好吗?

谢谢!


问题答案:

您可以在服务本身而不是控制器中重试该请求。

因此,AsyncService.query可能是这样的:

AsyncService.query = function() {
  var counter = 0
  var queryResults = $q.defer()

  function doQuery() {
    $http({method: 'GET', url: 'https://example.com'})
      .success(function(body) {
        queryResults.resolve(body)
      })
      .error(function() {
        if (counter < 3) {
          doQuery()
          counter++ 
        }
      })
  }

  return queryResults.promise
}

您可以摆脱控制器中的错误功能:

myApp.controller('myController', ['$scope', 'AsyncService',
  function($scope, AsyncService) {
    $scope.getData = function(query) {
      return AsyncService.query(query).then(function(response) {
        // Got success response
        return response;
      });
    }
  }
]);


 类似资料:
  • 问题内容: 我需要创建链式承诺: 如果我将errorCallback放在第一个中,则第二个将被解析,并调用其successCallback。但是,如果我删除了,那么第二个承诺将被拒绝。 根据Angular JS的文档,传播拒绝的唯一方法是返回并且它看起来并不明显,尤其是因为即使不需要它,我也必须注入服务。 也可以通过在中引发异常来完成此操作,但是它将异常跟踪写入控制台,这不好。 还有另一种选择可以

  • 问题内容: 我在理解为什么拒绝不通过承诺链传递时遇到问题,我希望有人能够帮助我理解原因。对我而言,将功能附加到承诺链上意味着我有意要实现的原始承诺。很难解释,所以让我先显示我的问题的代码示例。(注意:此示例使用的是Node和延迟的节点模块。我使用Dojo 1.8.3对此进行了测试,并得到了相同的结果) 运行此操作的结果是以下输出: 好吧,对我来说,这个结果没有道理。通过附加到该承诺链,每个人都暗示

  • 问题内容: 我在理解为什么拒绝不通过承诺链传递时遇到问题,我希望有人能够帮助我理解原因。对我来说,将功能附加到承诺链上意味着我有意要实现的原始承诺。很难解释,所以让我先显示我的问题的代码示例。(注意:此示例使用的是Node和延迟的节点模块。我使用Dojo 1.8.3对此进行了测试,并得到了相同的结果) 运行此操作的结果是以下输出: 好吧,对我来说,这个结果没有意义。通过附加到这个承诺链,每个人都暗

  • 问题内容: 我已经阅读了几篇有关该主题的文章,但是我仍然不清楚是否与抛出错误之间有区别。例如, 使用Promise.reject 使用抛出 我倾向于仅使用它,因为它更短,但我想知道一个相对于另一个是否有任何优势。 问题答案: 使用一个相对于另一个没有优势,但是,在特定情况下无法使用。但是,这些情况可以解决。 每当您进入promise回调时,都可以使用。但是,如果您在任何其他异步回调中,则必须使用。

  • 问题内容: 在我的服务器应用程序中,当用户无权访问端点时,我想返回“禁止”值。 为此,我创建了一个被拒绝的重用承诺: 然后在应用程序中的其他位置: 但是,当我启动我的应用程序时,会收到警告 我怎么能告诉Node这个Promise可以解决呢? 问题答案: 我创建了被拒绝的重用承诺 好吧,仅创建一个可重用的函数可能会容易得多: 每次调用该错误时,也会为该错误提供适当的堆栈跟踪。 我怎么能告诉Node这

  • 问题内容: 我将慢速的WebSockets服务器包装在AngularJS服务中,然后从我的控制器调用该服务。如果我将回调链接到回调上,则一切正常,所有UI均异步更新。 当我尝试用来清理一团糟的回调时,似乎我的延迟请求从未被调用。我熟悉从Python的Twisted派生的概念,因此我认为从概念上讲一切都应该起作用-但事实并非如此。 这是我能想到的最短的例子,慢速的WebSockets服务器是使用se