繁体   English   中英

在$ routeProvider的resolve功能中使用Promise链接

[英]Using promise chaining in resolve feature of $routeProvider

我在resolve方法中的一个变量与另一个变量相关,是否可以在resolve方法中的多个变量之间共享相同的promise?

似乎$ route.current.locals存储了已解析的变量,但是当处理var2时,由于尚未解析var1,因此$ route.current.locals为null。 我想要的是这样的:

$routeProvider.when('/report/:ruleId', { resolve: {
    var1: ['$route', 'service', function ($route, service) {
        return service.getRequest();
    }],
    var2: ['$route', 'service', function ($route, service) {
        return service.getAnotherRequest($route.current.locals.var1.id);
    }]
}});

我希望这会起作用:

$routeProvider.when('/report/:ruleId', { resolve: {
    vars: ['$route', 'service','$q' function ($route, service) {
        var defer = $q.defer(),
        data = [];
        service.getRequest().then(function(firstResponse){
            data.push(firstResponse);
            service.getAnotherRequest(firstResponse.id).then(function(secondResponse){
                data.push(secondResponse);
                defer.resolve(data);
            });
        })

        return defer.promise;

    }],

}});

我认为在这种情况下,您的最佳选择不是完全承诺链,而是更多的承诺嵌套。 这将更改输出,但不会显着改变:

$routeProvider.when('/report/:ruleId', { resolve: {
    bothVars: ['$route', '$service', function ($route, $service) {
        return $service.getRequest().
        then(function(response1) {
            return $service.getAnotherRequest(response1.data.id).
            then(function(response2) {
                return {
                    var1: response1.data,
                    var2: response2.data
                };
            });
        });
    ]
}});

如果您嵌套得太深,可能会有点疯狂,但是我认为这很好。 我不喜欢这种解决方案,但这是我针对此特定问题找到的最好的解决方案。 最后一点:不要在您自己的服务前加上“ $”。 Angular对自己的服务使用该约定以避免冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM