Attualmente sto provando a inviare a un array (attributo all'interno di un modello Mongo), da un elenco di elementi ricevuti tramite una richiesta. Da questi elementi, faccio un loop attraverso di essi per vedere quale è attualmente nel db e, in caso contrario, creo un nuovo oggetto e provo a salvarlo. Sto usando le promesse per portare a termine questo compito, ma non sono in grado di capire perché l'array è vuoto dopo che tutte le promesse si sono avverate.Node.js Promette: Invia all'array in modo asincrono e salva
var q = require('q');
var items_to_get = ['1', '2', '3']; // example array
var trans = new Transaction({
items : []
});
var promises = [];
for (var i = 0; i < items_to_get.length; i++) {
var ith = i; //save current i, kinda hacky
var deferred = q.defer(); //init promise
//find an existing item
Item.findOne({simcode: items_to_get[ith]}, function(err, item) {
trans.items.push(item); // push item to transaction
deferred.resolve(item); // resolve the promise
});
promises.push(deferred); // add promise to array, can be rejected or fulfilled
};
q.allSettled(promises).then(function(result) {
console.log(trans.items); //is empty
trans.save();
}
EDIT Risolto: Codice soffietto, sulla base di http://jsbin.com/bufecilame/1/edit?html,js,output .. crediti andare a @macqm
var items_to_get = ['1', '2', '3'];
var promises = []; //I made this global
items_to_get.forEach(item) {
upsertItem(item);
}
q.allSettled(promises).then(function(result) {
//loop through array of promises, add items
result.forEach(function(res) {
if (res.state === "fulfilled") {
trans.items.push(res.value);
}
});
trans.save();
promises = []; //empty array, since it's global.
}
//moved main code inside here
function upsertItem(item) {
var deferred = q.defer(); //init promise
//find an existing item
Item.findOne({simcode: item}, function(err, item) {
deferred.resolve(item); // resolve the promise
// don't forget to handle error cases
// use deffered.reject(item) for those
});
promises.push(deferred); // add promise to array
}
Sembra che ogni risultato sarà un oggetto della struttura '{state: ..., value: ...}', dove 'value' è un oggetto che vuoi, quindi potresti dover fare un ulteriore passaggio per ottenere fuori. – macqm