2015-02-12 31 views
5

Utilizzando Bluebird a Promisfy Mongoose, ho un (funzione Promise.map con una serie di if/else per connettere a un array per vedere se esiste un documento di riferimento, altrimenti creare uno ..Promise findOneAsync variable = {"isFulfilled": false, "isRejected": false}?

Assegnazione del prodotto di findOneAsync a una variabile, per poi assegnare 'variable._id' ad un nuovo documento in divenire (la promessa principale), i log della console {"isFulfilled":false,"isRejected":false}

Ecco un frammento:

for (i=0; i<items.length; i++) { 
    var existingItem = Models.Items.findOneAsync({ item: items[i] }); 
    console.log("existingItem : "); 
    console.log(JSON.stringify(existingItem)); 
    console.log("existingItem._id : " + existingItem._id); 

Ecco un registro :

existingItem : 
{"isFulfilled":false,"isRejected":false} 
existingItem._id : undefined 

Perché potrebbe essere la variabile existingItem in sospeso per il Model.Item.findOneAsync ..?

+0

non vedo si assegna un valore a 'variable._id'. Dovremmo immaginare come appare il tuo codice? – JLRishe

risposta

4

tua domanda non è molto chiaro, ma la mia domanda a voi sarebbe, perché sarebbe existingItemnon essere in attesa subito dopo è stato recuperato.

Capisci come usare le promesse? La maggior parte del tempo è necessario per ottenere i loro valori risolti utilizzando .then() o altre funzioni di manipolazione promessa:

var existingItem = Models.Items.findOneAsync({ item: items[i] }); 
existingItem.then(function (value) { 
    console.log("existingItem : "); 
    console.log(JSON.stringify(existingItem)); 
    console.log(JSON.stringify(value);); 
    console.log("existingItem._id : " + existingItem._id); 
}); 
+0

Apprezzo il puntatore. Ecco dove si trova: https://stackoverflow.com/questions/28482021/promise-map-not-finshing-because-successent-promise-join-finishes-first-promise – Stacks

0

Penso che si desidera:

return Promise.each(items, function(item) { 
    return Models.Items.findOneAsync({item: item}).then(function(existingItem) { 
    console.log("existingItem", existingItem); 
    }); 
}); 
+0

Esiste uno schema migliore di questo: https://stackoverflow.com/questions/28482021/promise-map-not-finshing-because-subsequent-promise-join-finishes-first-promise – Stacks

0

findOneAsync() semplicemente non ha terminato l'esecuzione ma quando si inizia a scrivere console.logs.

Anche complicazioni, sembra che findOneAsync() stia restituendo una promessa (lo stato non è né soddisfatto né respinto al punto in cui si stanno scrivendo i registri).

Quindi, se si desidera memorizzare e accedere l'oggetto trovato, è necessario

  1. Attendere che la promessa risolvere utilizzando la sua .then() fucntion, e
  2. recuperare l'elemento trovato dal "risolto valore". findOneAsync() deve passare l'oggetto oggetto trovato come parametro alla sua funzione resolve() (ad esempio da qualche parte all'interno di findOneAsync() ci sarebbe: resolve(foundItem);).

Supponendo che tutto, questo dovrebbe funzionare:

for (i=0; i<items.length; i++) { 
     var findPromise = Models.Items.findOneAsync({ item: items[i] }); 
     //the next line won't run until findOneAsync finishes 
     findPromise.then(resolveResult => { 
      var existingItem = resolveResult; 
      console.log("existingItem : "); 
      console.log(JSON.stringify(existingItem)); 
      console.log("existingItem._id : " + existingItem._id); 
     } 
    } 
Problemi correlati