Подтвердить что ты не робот

Цепочные вызовы ватерлинии с помощью 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(...). Затем → * и обновления.

Огромное спасибо от любой помощи

4b9b3361

Ответ 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" и "значения", чтобы они возвращались, и все они были завершены в следующий "затем".