Цепочные вызовы ватерлинии с помощью Promises
Я ударился головой о стену в течение последних 3 дней.
Я использую sailsjs и waterline ORM, которые поставляются в комплекте. Я хочу запускать вызовы DB один за другим. Я знаю, что могу сделать это, вложив внутри "затем" вызовы, но это выглядит неправильно.
Я несколько раз изучал Q-документацию и учебники, но я до сих пор не понимаю, как подключать и запускать "затем" вызовы из существующего Promises последовательно: (
Я хочу:
- создать пользователя
- создать действие
- связать пользователя и действие
- обновить пользователя
- обновить действие
Мой код выглядит как
var mail = '[email protected]';
Users.create({email:mail, name:''}).then(console.log).fail(console.log);
Actions.create({actionID:123})
.then(function(error, action){
Users.findOneByEmail(mail).then(function(person){
person.actions.add(action.id);
person.save(console.log);
}).fail(console.log)
});
Users.update({email:mail},{name:'Brian'}).exec(console.log);
Actions.update({actionID:123},{now:'running'}).exec(console.log);
Как вы можете видеть из кода, я использовал сочетание exec, а затем: P
Я думаю, что путь заключается в подключении
Затем → Action.create(...). Затем → Users.findOneByEmail(...). Затем → * и обновления.
Огромное спасибо от любой помощи
Ответы
Ответ 1
Итак, после дневного исследования. Кажется, я взломал его.
Примечание. Первая версия, с которой я работал, была выстроена в очередь (удалив пирамиду гибели), вернув создание. Это позволяет мне позвонить затем на следующей строке, чтобы запустить создание. http://documentup.com/kriskowal/q/#tutorial/chaining
Здесь моя окончательная версия
var mail = '[email protected]';
Users.Create({email:mail,name:''})
.then(function(user){
return [Actions.create({actionID:123}),user];
}).spread(function(action, user){
user.action.add(action.id);
user.name = 'Brian';
user.save();
action.now = 'running';
action.save();
}).catch(console.error);
Одна из интересных вещей - это "распространение", которая позволяет вам группировать "Promises" и "значения", чтобы они возвращались, и все они были завершены в следующий "затем".