Bluebird Promesse de série de l'itération, et la volonté de le tableau modifié?
J'ai cette promesse, qui crée un nouveau Item
document s'il n'est pas trouvé dans la base de données, puis les stocke dans un créé précédemment Collection
document..
La Collection de documents est la première chaîne dans un tableau, et tout autre indice dans le tableau se traduit par un ou plusieurs Élément docs.
Promesse.chaque "Résout le tableau original non modifié" et donc le dernier return
dans le Promise.each
est de restituer les objets, mais, par la suite .then
produit le tableau d'origine..
Voici la promesse (en abrégé pour des raisons de lisibilité):
globalVar = true;
collectionId = "";
var itemSeries = Promise.each(items, function(element) {
if (globalVar == true) {
return Models.Collection.findOneAsync({
"name": element
})
.then(function(collection) {
//promise chain similar to the following else..
//set the collectionId var to an _id
});
} else {
return Models.Items.findOneAsync({
"name": element
})
.then(function(item) {
if (item == null) {
return Models.Labels.findOneAsync({
"title": element
})
.then(function(label) {
var newItem = new Models.Items({
name: element,
label: label._id
});
return newItem.saveAsync();
}).then(function() {
return Models.Items.findOneAsync({
"name": element
});
}).then(function(item) {
item.collection = collectionId;
return item.saveAsync();
}).then(function() {
return Models.Items.findOneAsync({
"name": element
});
}).then(function(item) {
allItems.push(item);
console.log("allItems: [ ");
console.log(allItems);
return allItems;
});
}
});
}
}).then(function(allItems) {
console.log("allItems: [ ");
console.log(allItems);
return allItems;
});
Et voici le dernier de la console.log
au sein de la Promesse.chaque:
allItems: [
[ { _id: 54eec5f2b9fb280000286d52,
name: 'one',
label: 54eec5f2b9fb280000286d51,
collection: 54eec5f2b9fb280000286d50,
__v: 0 },
{ _id: 54eec5f2b9fb280000286d54,
name: 'two',
label: 54eec5f2b9fb280000286d53,
collection: 54eec5f2b9fb280000286d50,
__v: 0 } ]
Et puis après que la réparation .then(function(allItems) {
voici la dernière console.log
:
allItems: [
[ 'collectionName', 'one', 'two' ]
Aussi, la variable itemSeries
que = Promise.each
plus tard rend undefined
en une Promesse.rejoindre?
OriginalL'auteur Stacks | 2015-02-26
Vous devez vous connecter pour publier un commentaire.
La
.each
fonction ne modifie pas la valeur qui est passé par le biais de la chaîne:J'ai simplifié le code, comme entrée je suppose:
Pour votre code:
Le résultat sera toujours
['one','two']
parce que ce sont résolus les valeurs de la matriceitems
. La valeur retournée dans le chacun de ne pas influencer le contenu de la valeur passée à la enchaînésthen
.La
.map
fonction de l'autre coté, avoir cet effet:Ici la
return
valeur valeur sera utilisée pour créer un nouveau tableau qui sera ensuite transmis à lathen
. Voici le résultat serait['one.','two.']
.Les deux
allItems
figurant dans votre code sont différents objets.MODIFIER
Pour les en série itération avec la cartographie, je voudrais écrire une fonction d'aide comme ceci:
Source: Mettre En Œuvre La Promesse.série
allItems
de la valeur de retour? .chacun est nécessaire, car la séquence est nécessaire..ajout d'une édition à mon commentaire.
fwiw .chaque comme .mapSeries dans la version 3.0 depuis le retour à la matrice existante n'a pas été utile
oh c'est bon à savoir. Je suis assez sûr de relais sur ce comportement quelque part -.-
Génial. Merci pour le mapSeries
OriginalL'auteur t.niese
Bluebird désormais nativement met en œuvre un
mapSeries
, voir http://bluebirdjs.com/docs/api/promise.mapseries.htmlIl ressemble également à
Promise.each
renvoie toujours le tableau d'origine, malheureusement, dans v3.x.x.OriginalL'auteur Adam Reis