我可以从.then()回调中返回一个承诺吗?

时间:2015-02-19 14:38:46

标签: angularjs typescript

我有一个场景,如果它不存在我需要创建一个任务,在两个案例中都返回任务。

以下代码是否正确?

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总是返回一个promise,一个在回调中返回的对象的promise。如果t是某种内容,则会返回t,因此。then会返回ng.IPromise<Task>吗?但是如果t不是,那么返回CreateTask(taskName),而ng.IPromise<Task>会返回then类型的承诺,那么返回ng.IPromise<ng.IPromise<Task>>的是什么? then?或ng.IPromise<Task>展开它并返回{{1}}?

1 个答案:

答案 0 :(得分:1)

是的,绝对可以在.then中返回一个承诺 - 这就是你执行连续异步操作的方法。

如果您在.then中返回承诺,那么当履行此承诺时,结果将被提供给下一个链接的.then

如果您返回(非承诺)值,则此值将被赋予下一个链接.then

主要的是没有一个API有时会返回一个承诺,有时会返回一个值 - 但这不是你所拥有的,所以你没事。

这里有illustrative example (plunker)与你的相似。