2014-10-18 10 views
13

Ich habe mich in den letzten 3 Tagen von einer Wand getroffen.Verketten von Wasserlinienanrufen mit Promises

Ich benutze sailsjs & die Wasserlinie ORM, die gebündelt kommt. Ich möchte DB-Anrufe nacheinander ausführen. Ich weiß, dass ich das tun kann, indem ich in "dann" Anrufe niste, aber es sieht einfach falsch aus.

Ich habe über die Q-Dokumentation gegangen und mehrmals Lektionen, aber ich immer noch nicht, wie zu verbinden und Feuer „dann“ Anrufe von bestehenden Promises sequentiell :(

ich will:

  1. erstellen Sie einen Benutzer
  2. erstellen Aktion
  3. Link der Benutzer & Aktion
  4. Update der Benutzer
  5. Aktualisierung der Aktion

Mein Code wie

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

sieht aus, als Sie aus dem Code sehen kann ich eine Mischung aus exec & dann habe: P

Ich denke, die Art und Weise Verbinden Sie die Users.create (...). dann -> Action.create (...). dann -> Users.findOneByEmail (...). dann -> * und die Updates.

Huge dank von jeder Hilfe

Antwort

13

So nach einem Forschungs Tag. Ich denke, ich habe es geknackt.

Hinweis: Die erste Version, die ich habe Arbeit hatte das „dann“ s aufgereihten (Entfernen der Pyramide des Schicksals) durch Rücksendung der erstellen. Damit erlaube ich mir dann auf die nächste Zeile zu feuern die create. http://documentup.com/kriskowal/q/#tutorial/chaining

Hier ist meine letzte Version

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

Einer der coolen Dinge wird der „Spread“, die Sie „Promises“ und „Werte“ auf Line-up erlaubt zu sein, eine Rückkehr sie alle abgeschlossen haben in das nächste "dann".

+0

Ihr 'fail' funktioniert nicht und zieht' catch' vor. Anders als diese gute Arbeit! –

+0

Danke @BenjaminGruenbaum Ich wusste nicht, ob ich ein final done() oder then() zB '}). Then(). Fail ('. Hätte das funktioniert? ODER swapping das fail (...) Für einen Fang (...) meinst du das? – codemeasandwich

+0

Auch auf http://documentup.com/kriskowal/q/#tutorial hat das erste Beispiel 'catch (...). done();' Warum machen wir das? brauche das final ** done **? – codemeasandwich