2014-10-18 11 views
13

Mi sono battuto con la testa da un muro su questo per gli ultimi 3 giorni.Concatenare chiamate di linea di galleggiamento con Promises

Sto usando sailsjs & l'ORM della linea di galleggiamento che viene fornito in bundle. Voglio eseguire chiamate DB una dopo l'altra. So che posso farlo annidando all'interno di "allora" chiamate ma sembra solo sbagliato.

ho superato la documentazione Q e tutorial diverse volte, ma io ancora non capisco come collegare e fuoco "poi" le chiamate dalle promesse esistenti in sequenza :(

Voglio:

  1. creare un utente
  2. creare un'azione
  3. link che l'utente & azione
  4. aggiornamento l'utente
  5. aggiornamento l'azione

mio codice è simile

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

Come si può vedere dal codice ho usato un mix di exec & allora: P

Penso che il modo è quello di collegare Users.create (...). poi -> Action.create (...). poi -> Users.findOneByEmail (...). poi -> * e gli aggiornamenti.

enorme grazie da qualsiasi aiuto

risposta

13

Così, dopo una giornata di ricerche. Penso di averlo rotto.

Nota: La prima versione ho ottenuto lavorando aveva il "poi" s allineati-up (la rimozione della piramide di Doom) restituendo il creare. Questo mi consente di chiamare sulla riga successiva per attivare il comando. http://documentup.com/kriskowal/q/#tutorial/chaining

Ecco la mia versione finale

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

Una delle cose più interessanti è lo "spread" che permette di line-up "Promises" e "valori" di essere di ritorno quella che tutti hanno completato nel prossimo "poi".

+0

Il tuo 'fail' non funzionerà e preferisce' catch'. A parte questo buon lavoro! –

+0

Grazie @BenjaminGruenbaum Non sapevo se avevo bisogno di un finale done() o then() eg.}). Then(). Fail ('. Avrebbe funzionato? OPPURE scambiando il fail (...) per una presa (...) è ciò che intendi? – codemeasandwich

+0

Anche su http://documentup.com/kriskowal/q/#tutorial il primo esempio ha 'catch (...). done();' Perché hai bisogno del finale ** fatto **? – codemeasandwich