在$ routeProvider的解析功能中使用promise chaining

时间:2014-09-02 14:50:10

标签: javascript angularjs angular-promise ngroute

我在resolve方法中的一个变量具有另一个变量的依赖关系,是否可以在resolve方法中的变量之间共享相同的promise?

似乎$ route.current.locals存储已解析的变量,但是当处理var2时,$ route.current.locals为null,因为var1尚未解析。我试图做的是这样的事情:

$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);
    }]
}});

2 个答案:

答案 0 :(得分:4)

我希望这会奏效:

$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;

    }],

}});

答案 1 :(得分:1)

我认为在这种情况下你最好的选择并不是完全承诺链接,更有希望嵌套。这会改变输出,但不会显着改变:

$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为其自身的服务使用该约定来避免冲突。