如果 ui 路由器解析的一部分返回 true 或承诺,我如何编码它



这是我的代码:

resolve: {
            get: ['setTest', 'questionService', 'testService', '$stateParams',
                (setTest, qus: IQuestionService, tes: ITestService, $stateParams) => {
                    if (tes.qs) {
                        qus.mapUserTestQuestions(tes.qs);
                        return true;
                    } else {
                        var userTestId = parseInt($stateParams.testId.substring(6, 11));
                        return qus.getUserTestQuestions(userTestId);
                    }
                }]
        },

问题是我收到一条消息说"没有通用返回类型",我想这是因为 if 的一部分返回 true,另一部分返回承诺。

在大多数情况下,

应该有比同步返回布尔值与承诺某些问题更好的解决方案。这也会导致控制器上出现一些可能可以避免的决策逻辑。

似乎在第一种情况下,您已经拥有所需的数据,不需要执行任何异步调用。那么,为什么不通过承诺(假设mapUserTestQuestionsgetUserTestQuestions的结果属于同一类型)返回此(同步)转换的数据。如果是这样,只需使用 $q 服务包装结果,如下所示:

return $q.when(qus.mapUserTestQuestions(tes.qs));

通过这种方式,您可以以相同的方式访问数据,无论它是否已经存在或您需要执行一些异步调用。有关$q请参阅:https://docs.angularjs.org/api/ng/service/$q#when

TypeScript 1.4 添加了联合类型,它允许使用类型列表注释变量:

let myVar: boolean|string;
// both of these are valid assignments
myVar = true;
myVar = 'hello world';

您还可以将其应用于函数的返回类型,如下所示:

resolve: {
    get: ['setTest', 'questionService', 'testService', '$stateParams',
        (setTest, qus: IQuestionService, tes: ITestService, $stateParams): boolean|Promise => {
            if (tes.qs) {
                qus.mapUserTestQuestions(tes.qs);
                return true;
            } else {
                var userTestId = parseInt($stateParams.testId.substring(6, 11));                    
                return qus.getUserTestQuestions(userTestId);
            }
        }]
},

请注意匿名函数返回类型上的boolean|Promise类型注释。

最新更新