2014-08-14 2 views
0

У меня есть http-запрос, который должен возвращать список задач. Однако эти задачи генерируются сложным образом. Вот как это работает.Комплексное обещание Q: одно обещание создает массив других обещаний

  1. Получить все текущие задачи из БД
  2. истекают задачи, которые старые
  3. профили пользователей получают от DB
  4. , если пользователь не имеет профиль и задачи для создания профиля Безразлично не существует, добавьте задачу для создания профиля
  5. дополнительно, для каждого подпрофа, который пользователь имеет, выполняет ежедневную задачу и сохраняет ее в БД, если ежедневная задача еще не создана.
  6. вернуть все задачи в HTTP вызывающих

я перечисляю все это здесь, в случае, если есть лучший способ сделать это. Насколько я понимаю, у меня должны быть обещания для обоих вызовов БД, за которыми последуют обещания, которые манипулируют данными задачи/профиля.

Я не понимаю, как добавить обещания N, необходимые для ежедневных задач, в мою цепочку обещаний. Мне также нужны все данные, доступные для окончательного процесса, чтобы вернуть вновь созданный список задач. Должен ли я как-то вкладывать в свои обещания?

В настоящее время, я предполагаю, что это нечто вроде этого:

var taskPromise = dbPromise(serverName, taskRequest, params); 
var profilesPromise = dbPromise(serverName, profilesRequest, params); 

Q.all([taskPromise, profilesPromise]) 
.then(function(arrayOfTasksAndProfiles){ 
      //do calculations and create an object like {tasks:[], profile:profile, subprofiles:[]}) 
.then(function(currentDataObject) { 
      var deferred = Q.defer(); 
      var newTasksToBeCreated = // make a list of all the new tasks I want to create 
      var promisesForNewTasks = [] // create an array of promises that save each of the new tasks to the server 
      Q.all(promisesForNewTasks) 
      .then(function(returnedIDsForNewTasks) { 
        // somehow match the returned IDs to the newTasksToBeCreated and add them on 
        currentDataObject.newTasks = newTasksToBeCreated 
        deferred.resolve(currentDataObject); 
       });) 
.then(function(currentDataObject) { 
      // now that the currentDataObject has all the tasks from the DB, plus the new ones with their IDs, I can respond with that information 
      res.json(currentDataObject)) 
.done(); 

Я должен сделать несколько звонков в БД, чтобы создавать новые задачи, и мне нужно, чтобы вернуть те приложили к другим задачам, которые я получил от DB, и единственный способ, которым я могу это сделать, - вложить вызов Q.all().

«Там должен быть лучший способ».

+0

Не путайте «задачу» с «обещанием». Можем ли мы говорить о «todo-items» или так? Часто обещания представляют собой результат * выполнения * задачи * :-) – Bergi

+0

Вы правы, я должен, вероятно, изменить это на что-то еще, чтобы избежать путаницы. Когда я говорю о «задачах», я ссылаюсь только на объект в моем приложении задачи типа. Они похожи на: {type: "task", item: "go to the store"} или {type: "task", item: "add user profile"}, а не задачи, которые выполняет обещание. – Summitch

+0

Я думаю, что все в порядке, пока ясно, что вы не выполняете «задачи», – Bergi

ответ

1

Только одно: не создавайте пользовательский deferred, который необходимо вручную решить. Вместо этого, только return от обработчика then; и return получившееся обещание вызова .then().

.then(function(currentDataObject) { 
    var newTasksToBeCreated = // make a list of all the new tasks I want to create 
    var promisesForNewTasks = [] // create an array of promises that save each of the new tasks to the server 
    return Q.all(promisesForNewTasks) 
// ^^^^^^ 
    .then(function(returnedIDsForNewTasks) { 
     // somehow match the returned IDs to the newTasksToBeCreated and add them on 
     currentDataObject.newTasks = newTasksToBeCreated 
     return currentDataObject; 
//  ^^^^^^ 
    }); 
}) 

Else, это выглядит неплохо. Если у вас возникли проблемы с соответствием возвращаемым идентификаторам задач - не делайте этого. Вместо этого сделайте каждый из promisesForNewTasks с помощью собственного объекта задачи (в сочетании с идентификатором?).

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