2015-07-31 9 views
8

Grazie in anticipo per l'aiuto.Bluebird promette - ogni funzione

Durante l'utilizzo delle promesse Bluebird, ho una serie di promesse in esecuzione. Durante l'ultima promessa, voglio eseguire una funzione più volte per ogni oggetto in una matrice.

Sotto c'è il pseudocodice:

var userArray = [ 
    { 
     name: "John", 
     email: "[email protected]" 

    }, 
    { 
     name: "Jane", 
     email: "[email protected]" 
    }]; 

var functionOne = function() { 
    //returns Promsie object 
}; 

var functionTwo = function() { 
    //returns promise object 
}; 

var createUser = function(user) { 
    return User.findOrCreate({email: user.email},{ 
     name: user.name, 
     email: user.email 
    }); 
}; 

functionOne() 
    .then(functionTwo) 
    .each(createUser(userArray)) 
    .then(function onComplete() { 
     console.log("Complete"); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 

So che non sto usando correttamente la ciascuna funzione. Qual è il modo corretto di implementare questo utilizzando Bluebird?

+0

qual è l'array che si desidera ripetere con 'each' on? Viene restituito da 'functionTwo' o è' userArray'? – Sosdoc

+0

@Sosdoc Voglio eseguire l'iterazione su userArray – Jay

+0

È necessario passare una funzione di callback a 'each', non una promessa. – Bergi

risposta

2

Grazie a @Roman @Yuri per l'aiuto! Il mio codice ora funzionante è il seguente:

var userArray = [ 
{ 
    name: "John", 
    email: "[email protected]" 

}, 
{ 
    name: "Jane", 
    email: "[email protected]" 
}]; 

var functionOne = function() { 
    //returns Promise object 
}; 

var functionTwo = function() { 
    //returns Promise object 
}; 

var createUser = function(singleUser) { 
    //returns Promise object containing creating User 
}; 

functionOne() 
    .then(functionTwo) 
    .then(function() { 
     return Promise.map(userArray, createUser); 
    }) 
    .then(function onComplete(response) { 
     console.log("Complete:" + JSON.stringify(response)); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 
12

Come ho capito, si desidera prendere alcune azioni asincrone per gli elementi dalla matrice. Poi si prega di consultare il seguente esempio:

var Promise = require('bluebird'); 

function createUsersFromArray(userArray){ 
    return Promise.each(userArray, function(signleUser){ 
     return createUserFunction(signleUser); 
    }); 
} 

o

return Promise.each(userArray, createUserFunction); 

functionOne() 
    .then(functionTwo) 
    .then(function(){ 
     return createUsersFromArray(userArray); 
    }) 
//or just .then(createUsersFromArray) if functionTwo return this array 
    .then(function(createdUsers){ 
     //here you may retrieve users and make some magic with them 
     console.log(createdUsers); 
    }) 
    .then(function onComplete() { 
     console.log("Complete"); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 

anche io consiglio di usare "tutti" invece di "ogni"

Controllare esempi qui sotto:

return Promise.all(userArray.map(function(singleUser){ 
    return doSomethingWithUser(singleUser); 
})); 

oppure

return Promise.all(userArray.map(doSomethingWithUser)); 

'all' ti informerà se tutte le azioni sono state eseguite correttamente.

Come utilizzare promesse (best practice):

http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html https://blog.domenic.me/youre-missing-the-point-of-promises/

+0

Grazie per la risposta. Nel secondo blocco di codice, la funzione 'createUserFunction' restituisce un oggetto Promise o User? – Jay

+0

@Jay La funzione restituisce una promessa, ma è possibile recuperare gli utenti se la funzione restituisce questi utenti. Quindi voglio dirti quanto segue. Se il 'createUsersFromArray' funzione di ritorno/user risolvere creato, allora si può recuperare questo utente nel prossimo 'poi' dichiarazione come 'createUsersFromArray (userArray) .then (function (createdUser) { console.log (createdUser) }); ' Ho anche aggiornato la mia risposta, si prega di controllare la funzione prima di 'onComplete' –

5

L'implementazione più semplice:

functionOne() 
    .then(functionTwo) 
    .then(function(){ 
     return bluebird.each(userArray, createUser); 
    }) 
    .then(function onComplete() { 
     console.log("Complete"); 
    }) 
    .catch(function onError() { 
     console.log("Um...it's not working"); 
    }); 

Si consiglia di utilizzare .map invece di .each se si desidera accedere i risultati di tutti quelli che creano.

Problemi correlati