2015-02-19 5 views
0

У меня есть сценарий, когда мне нужно создать задачу, если она не существует, возвращая задачу в обоих случаях.Могу ли я вернуть обещание от .then() обратного вызова?

Правильный ли приведенный ниже код?

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

Будет ли она работать?

EDIT:

Только посмотрите на этот кусок кода:

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

then всегда возвращает обещание, обещание объекта возвращается в обратный вызов. если t что-то тогда возвращает t, поэтому. then возвращение ng.IPromise<Task> правый ?. Но если t не что-то, то возвращает CreateTask(taskName), который в свою очередь возвращает обещание типа ng.IPromise<Task>, так что возвращает then? ng.IPromise<ng.IPromise<Task>>? или then разворачивает его и возвращает ng.IPromise<Task>?

+0

Что вы пытаетесь достичь? –

+0

Создайте задачу (или что-то еще), если она не существует с минимально возможным кодом. Я могу написать его с помощью $ q.defer, но для этого требуется более шаблонный код. –

+0

Я просто спрашиваю, правильный ли код: if (t) return t; else return CreateTask (taskName); Я возвращаю объект, если он существует, или возвращает обещание, которое его создает. –

ответ

1

Да, вы можете вернуть обещание в .then - так вы выполняете последовательные асинхронные действия.

Если вы вернете обещание в .then, тогда, когда это обещание будет выполнено, результат будет передан следующей цепочке .then.

Если вы вернете значение (без обетования), это значение, которое будет присвоено следующей цепочке .then.

Главное, чтобы не иметь API, который иногда возвращает обещание и иногда возвращает значение - но это не то, что у вас есть, поэтому вы в порядке.

Вот illustrative example (plunker), аналогичный вашему.

+0

Отлично! Большое спасибо! –

Смежные вопросы