У меня есть http-запрос, который должен возвращать список задач. Однако эти задачи генерируются сложным образом. Вот как это работает.Комплексное обещание Q: одно обещание создает массив других обещаний
- Получить все текущие задачи из БД
- истекают задачи, которые старые
- профили пользователей получают от DB
- , если пользователь не имеет профиль и задачи для создания профиля Безразлично не существует, добавьте задачу для создания профиля
- дополнительно, для каждого подпрофа, который пользователь имеет, выполняет ежедневную задачу и сохраняет ее в БД, если ежедневная задача еще не создана.
- вернуть все задачи в 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().
«Там должен быть лучший способ».
Не путайте «задачу» с «обещанием». Можем ли мы говорить о «todo-items» или так? Часто обещания представляют собой результат * выполнения * задачи * :-) – Bergi
Вы правы, я должен, вероятно, изменить это на что-то еще, чтобы избежать путаницы. Когда я говорю о «задачах», я ссылаюсь только на объект в моем приложении задачи типа. Они похожи на: {type: "task", item: "go to the store"} или {type: "task", item: "add user profile"}, а не задачи, которые выполняет обещание. – Summitch
Я думаю, что все в порядке, пока ясно, что вы не выполняете «задачи», – Bergi