2017-11-06 4 views
0

ich einen Weg brauchen Wert zu speichern außerhalb mongoDB Anruf verbinden:mongodb NodeJS Speicherwert außerhalb verbinden

read(object) { 
    let result 
    MongoClient.connect(this.url, function (err, db) { 
     if (err!=null){ 
      result = err; 
     } else { 
      db.collection(object.collection).find(object.field).toArray(function(err, docs) { 
       assert.equal(err, null); 
       db.close();  
       result = docs; 
      }); 
     } 
    }); 
    return result 
} 

Wenn ich diese Methode aufrufen, die Teil einer Klasse ist, Rückkehr wird vor Ergebniszuweisung genannt, als normal . Beispiel: console.log(read(obj)) gibt undefined zurück

Die Idee ist, Wert in einer Variablen zu speichern, und Rückkehr möglicherweise warten, bis Verbindung beendet wird.

Gibt es eine Möglichkeit, dieses Problem zu lösen?

+0

Verwenden Sie [Promice] (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise) für das – MysterX

+0

es könnte eine Idee sein .. aber wenn ich Promise verwende, muss ich extrahieren Ergebnis eines Versprechens (in dann Anruf) – Mau

Antwort

0

Ohne Versprechen:

Anruf Rückkehr innen finden und irre Funktion:

read(object) { 
    let result 
    MongoClient.connect(this.url, function (err, db) { 
     if (err!=null){ 
      result = err; 
      return result; //here 
     } else { 
      db.collection(object.collection).find(object.field).toArray(function(err, docs) { 
       assert.equal(err, null); 
       db.close();  
       result = docs; 
       return result; // here 
      }); 
     } 
    }); 
} 

oder ein Timeout für die Rückkehr mit genügend Zeit eingestellt für anderen Prozess warten, bis zum Ende:

read(object) { 
    let result 
    MongoClient.connect(this.url, function (err, db) { 
     if (err!=null){ 
      result = err; 
     } else { 
      db.collection(object.collection).find(object.field).toArray(function(err, docs) { 
       assert.equal(err, null); 
       db.close();  
       result = docs; 
      }); 
     } 
    }); 
    setTimeout(function(){ return result}, 3000); // 3secs 
} 
+0

gibt es keinen Unterschied, denn wenn ich Methode aufrufen, gibt es undefined – Mau

+0

dann das Problem ist, dass Sie undefined val zu Ergebnis zuweisen, beantwortete ich basierend auf was Sie gefragt haben "Wenn ich das anrufe Methode, die Teil einer Klasse ist, wird Return vor der Ergebniszuweisung aufgerufen " – wrangler

+0

es ist absolut normal !! Die Ausführung eines Verbindungsverfahrens ist asynchron !! Ich muss mit diesem Verhalten umgehen – Mau

0

Mit Promise können Sie Folgendes versuchen:

function read(object) { 
    let result 
    return new Promise((resolve, reject) => { 
     MongoClient.connect(this.url, function (err, db) { 
      if (err!=null){ 
       reject(err); 
      } else { 
       db.collection(object.collection).find(object.field).toArray(function(err, docs) { 
        db.close(); 
        if (err) { 
         reject(err); 
        } else { 
         resolve(docs);           
        } 
       }); 
      } 
     }); 
    }); 
} 

// then you can call the function and use the result like this 
read(obj).then(docs => { 
    console.log(docs); 
}) 
.catch(err => { 
    // handle error 
    console.log(err); 
}) 
+0

ja, es funktioniert! Aber ich muss den Wert von Docs (oder err) außerhalb des Calls speichern! – Mau

+0

Ich kenne den Kontext Ihrer Anwendung nicht. Sie können das Ergebnis speichern, wie Sie wollen, sobald das Versprechen gelöst ist. Sie können eine Ergebnisvariable außerhalb der Lesefunktion definieren und der Variablen das Ergebnis (docs oder err) zuweisen. Oder wenn Sie eine Art Singleton/Service haben, weisen Sie dieses Ergebnis einer Variablen im Service zu, damit es für andere Teile Ihrer Anwendungen zugänglich ist. Es hängt davon ab, was Sie versuchen zu tun. – revy