【问题标题】:Fail-Proof UI-Router Resolve w/ Restangular?故障证明 UI-Router Resolve w/Restangular?
【发布时间】:2015-11-21 08:46:47
【问题描述】:

我正在尝试实现 UI-router resolves,即使 API 调用失败,它也会返回结果。我们的应用程序具有后端权限,如果调用失败,我仍然需要显示嵌套页面(如果解析调用正常失败,则不会加载,除非它被包装到 $q 承诺中。我这样实现它$http:

resolve: {
    kittens: ["$q", "$timeout","$http", function ($q, $timeout, $http,) {
            var url = "some api url"
            return $http.get (url)
                .then(function(result){ return {status:true , data: result} },
                function(){ return {status:false} }); //on failure, return this
        }],
}

上面的工作完美 - 它返回我在调用成功和失败时需要的内容,但是,如果我用 Restangular 尝试它似乎会失败,下面的代码工作正常:

                        kittens: function (Restangular) {
                            return Restangular
                                .one('stuff', 999999999999)
                                .all('stuffInStuff').getList()
                                .then(function (result) {
                                    return result;
                                });
                        },

但是如果我用上面的方法试试这个:

                                .then(function (result) {
                                    return result;
                                }, function(error){return error})

失败没有返回任何东西,控制器也没有被实例化。我不明白为什么会这样。我认为 $http.get() 和 Restangular.one().all().getList() (例如)都是等效的承诺,要么返回结果,要么失败。有什么不同?如何使用 Restangular 在调用失败时提供解析值?

编辑:顺便说一句,我确实阅读了this post,并且我知道如果未包装 UI 路由器解析,则如果承诺被拒绝,它将失败,但我似乎没有完全了解如何处理它与 Restanagular...

编辑 3:这也失败了:

                                .then(function (result) {
                                    return result;
                                })
                                .catch(function (error) {
                                    return error;
                                })

【问题讨论】:

  • 你能试试.catch吗?
  • 不知道这将如何工作。我只在 C# 的 try catch 的上下文中理解 catch。不能说我理解 $q 过去的链接承诺和使用 .all。
  • @PankajParkar:catch 基本上是 Restangular 的第二个函数的版本,通常可以处理错误吗?已编辑的帖子。
  • 在 github 上发现问题,你可以阅读这个github.com/mgonto/restangular/issues/451
  • 我只是读了,不明白它是如何应用的(我不是粗鲁,我真的很感谢你的回复,可能只是我不明白)。但是从阅读链接看来,您之前没有这样做 .then(function(){return result}) - 它会在成功调用时自动执行。现在您必须运行 .then 语句,但我 am 在这里运行它。也许我不清楚你的意思,但我通读了一遍。

标签: angularjs angular-promise restangular


【解决方案1】:

我认为你有两种方法,

1.) 不要在 ui 路由器的解析中返回 restangular 实例,因为您返回的承诺被拒绝。你不能原生地绕过这个拒绝。当您返回 Restangular.one().get() 并且它失败时,您的解析失败。如果您不返回实例,即使您的请求仍在加载,resolve 也会得到解决(我认为您不想要并且您想要等待成功/错误)

  1. 其次,对我来说正确的方法是这样。

      resolve: {
       kittens: ["$q", "Restangular", function ($q, Restangular) {
           var deferred = $q.defer();
           Restangular.one('some-api').get().then(function(data) {
               deferred.resolve(data);
           }, function(err) {
               deferred.resolve(err);
           });
           return deferred.promise;
       }],
      }
    

在这种情况下,每次都会解析解析,即使休息调用失败,你也会得到转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多