【问题标题】:Resolving a async variable already in the routeprovider解析路由提供程序中已经存在的异步变量
【发布时间】:2017-05-10 20:19:28
【问题描述】:

我有两个异步函数,我需要在 routeProvider 的解析部分解决其中一个。当用户在 url 上键入对象时,我想自动添加开始日期和结束日期。我的问题是日期解决得很晚。因为如果我在控制器中执行 console.log(datetable),它表明 dobject 已正确解析。但这为时已晚,我还需要调用 ObjectService.get() 时的日期,因为现在它只搜索 /object(产生 404)而不是 /object/startdate/enddate,因为变量为空。在调用 ObjectService.get() 之前如何解决日期?

我的工厂和服务方法

.factory("ObjectService", ["$resource", function($resource) {
                return $resource('/:object/:startdate/:enddate');
            }])
            .service("CurrentDates", ["DateService", function(DateService) {
                this.dates = function() {

                    DateService.query().$promise.then(function(info) {
                        currentdates.startdate = info.start;
                        currentdates.enddate = info.end;
                    }).catch(onError);
                    return currentdates;
                }
            }])

            .factory("DateService", ["$resource", function($resource) {
                return $resource('dates.json');
            }])

我的路由提供者

$routeProvider
            .when('/:object', {
                templateUrl: "template/table.html",
                controller: 'ObjectController',
                resolve: {
                    datetable: ["ObjectService", "CurrentDates", "$route",
                        function(ObjectService, CurrentDates, $route) {
                            var dates = CurrentDates.dates(); // dates should already be resolved here if possible
                            return ObjectService.get(Object.assign($route.current.params, dates)).$promise
                                .catch(function(errorResponse) {
                                    return {
                                        "error": errorResponse.status,
                                        "object": $route.current.params.object,
                                        "dobject": Object.assign($route.current.params, dates)
                                    };
                                });
                        }
                    ],
                }
            })

我试着这样写,但是没有用。

return CurrentDates.dates().then(function(dates) {
    return ObjectService.get(Object.assign($route.current.params, dates))
        .$promise.catch(function(errorResponse) {
            return {
                "error": errorResponse.status,
                "object": $route.current.params.object,
                "dobject": Object.assign($route.current.params, dates)
            };
        });
})

【问题讨论】:

  • CurrentDates 似乎没有current() 函数。这可能是一个错字,你的意思可能是CurrentDates.dates()。但是,该函数没有返回一个承诺,它返回一个空对象,因为 DateService.query 是异步部分。 resolve 需要接收 promise 对象,这意味着您的服务中的 .then 要么需要被包装,要么您需要在其他地方执行 .then 逻辑。
  • 你把我弄到了那里,修正了错误。关于'then',我认为问题是这样的。我只是不确定该怎么做,但是您的回答可以帮助我更好地理解问题。

标签: angularjs


【解决方案1】:

感谢 Claies 的提示,我设法做到了。我不得不重写我的服务方法:

.service("CurrentDates", ["DateService", function(DateService) {
            var currentdates = {
                startdate: null,
                enddate: null
            };
                this.dates = function() {
                    return  DateService.query().$promise.then(function(info) {
                        currentdates.startdate = info.start;
                        currentdates.enddate = info.end;
                        return currentdates;
                    }).catch(onError);
                }
            }])

然后我可以在 routeProvider 中解析变量数据表:

datetable:     ["ObjectService", "CurrentDates", "$route",
            function(ObjectService, CurrentDates, $route) {
                return CurrentDates.dates().then(function(dates) {
                    return ObjectService.get(Object.assign($route.current.params, dates))
                        .$promise.catch(function(errorResponse) {
                            return {
                                "error": errorResponse.status,
                                "object": $route.current.params.object,
                                "dobject": Object.assign($route.current.params, dates)
                            };
                        });
                })
            ]

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 2016-05-15
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2019-05-22
    • 2017-08-31
    • 2019-11-13
    • 2023-03-03
    相关资源
    最近更新 更多