我可以 return 来自 .then() 回调的承诺吗?

May I return a promise from a .then() callback?

我有一个场景,我需要创建一个任务(如果它不存在),在两种情况下都返回任务。

下面的代码正确吗?

CreateTaskIfNotExists(taskName: string): ng.IPromise<Task> {
     return this.GetTask(taskName)
        .then( t => {
            if (t) return t;
            else return this.CreateTask(taskName);
        });
}

CreateTask(taskName: string): ng.IPromise<Task> {
    // use $http to call Rest Web Service to create the task
    // and return promise
}

GetTask(taskName: string): ng.IPromise<Task> {
    // use $http to call Rest Web Service to getthe task
    // and return promise
}

以上代码在我从控制器调用的服务中:

TaskService.CreateTaskIfNotExists(taskName)
    .then( task => {
         $scope.Task = task; 
    });

有用吗?

编辑:

看看这段代码:

    .then( t => {
        if (t) return t;
        else return CreateTask(taskName);
    });

then总是returns一个承诺,回调中返回的对象的承诺。如果 t 是 returns t,那么 .then returns ng.IPromise<Task> 对吗?但是,如果 t 不是什么东西,那么 returns CreateTask(taskName) 又 returns 类型为 ng.IPromise<Task> 的承诺,那么 returns thenng.IPromise<ng.IPromise<Task>>?或 then 展开并 returns ng.IPromise<Task> ?

是的,您绝对可以 return .then 中的承诺 - 这就是您执行连续异步操作的方式。

如果你 return 在 .then 中做出承诺,那么当这个承诺被履行时,结果将被提供给下一个链接 .then

如果您 return 一个(非承诺)值,那么这是将被赋予下一个链接的值 .then

最主要的是不要有一个 API,有时 return 是一个承诺,有时 return 是一个值 - 但这不是你所拥有的,所以你很好。

这是一个与你的相似的 illustrative example (plunker)。