2016-11-19 1 views
-2

Ich habe so viel Zeit damit verbracht, zu versuchen, die Antwort hier zu finden und nichts zu finden. Hoffe, jemand kann mich erleuchten ..Javascript: Verwendung von Daten aus einer asynchronen Callback-Funktion (MongoClient)

Ich habe Code, der einen asynchronen Aufruf an eine Datenbank und die Rückgabe von Daten in einer Callback-Funktion (in meinem Fall verwende ich MongoClient, der eine Promise zurückgibt). Ich kann jedoch nicht herausfinden, wie die resultierenden Daten verwendet werden, um Variablen auf Funktionsebene tatsächlich zu setzen - immer wenn ich es versuche, ist der resultierende Wert, den ich protokolliere, entweder nicht definiert oder ein ausstehendes Promise-Objekt.

Es gibt viele Beiträge zu diesem Thema, aber ich kann keine Methoden finden, die funktionieren, wenn ich versuche, sie anzuwenden. Alle und alle Hilfe dankbar erhalten!

function lookupOneDbEntry(key, value) { 

    var responseData = "initial data" 

    // search for the entry in the database 
    db.collection("my_collection").findOne({key: value}, function(err, result) { 
     if (err) { 
     //if database throws an error 
     responseData = "db error"; 
     } 
     else { 
     // if the entry is found, return the data 
     responseData = result; 
     } 
    }); 

    return responseData; 

    } 

EDIT: Ich kenne andere Beiträge zu diesem Thema (wie dieser here und während erschöpfende Dokumentation in einem Ausmaß nützlich ist, I; habe Probleme mit diesen Daten praktisch in einer realen Umsetzung wie die oben. Daher meine Frage hier.

+1

Mögliches Duplikat [Wie kann ich die Antwort von einem asynchronen Aufruf zurückkehren?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchroner Anruf) – Andreas

+0

Diese Frage, die Sie verknüpften, hat wirklich alle Informationen, die Sie benötigen. Herr Klings Antwort enthält eine umfangreiche Menge an Erklärungen und verschiedene Lösungen für verschiedene Situationen. – Pointy

+0

Können Sie zeigen, wie Sie versuchen, das Versprechen zu verwenden? – Victory

Antwort

0

Async geschieht außerhalb des Stapels Aufruf aufruft, die Sie sind. Sie es auf den aktuellen Stack nicht zurückkehren kann.

So nutzen wir die Versprechen in die Ergebnisse einzuhaken von unserem Anruf.

function lookupOneDbEntry(key, value) { 
    return new Promise(function (resolve, reject) { 
    // search for the entry in the database 
    db.collection("my_collection").findOne({key: value}, function(err, result) { 
     if (err) { 
     //if database throws an error 
     reject(err); 
     } 
     else { 
     // if the entry is found, return the data 
     resolve(result); 
     } 
    }); 
    }); 
} 

lockupOneDbEntry('myKey', 'myValue').then(function (result) { 
    console.log('result', result); 
}, function (err) { 
    console.log("error!", err); 
}); 
+0

Schätzen Sie die Mühe, aber das hat nicht für mich funktioniert. Danke, dass Sie mich auf die Idee gebracht haben, das Versprechen zu lösen, aber ich schaffte es, eine Lösung basierend auf dieser Idee zusammenzusetzen :) – user2521119

+0

Kein Problem. Wenn es hilfreich war, sollten Sie upvote und wenn Sie eine Lösung gefunden haben, erklären Sie es, können Sie Ihre eigenen Fragen hier beantworten, wird es ermutigt. – Victory

0

Nach einer langen Zeit des Experimentierens habe ich es schließlich geschafft - ich brauchte am Ende keine schicken Callbacks oder zusätzliche Promises, ich entfernte einfach den optionalen Callback in der Datenbankanfrage und bearbeitete stattdessen das zurückgegebene Versprechen separat.

function lookupOneDbEntry(key, value) { 

    var responseData = "initial data"; 

    var solution = db.collection("accounting_module").findOne({key: value}); 

    solution.then(function (result) { 
     // validation of result here 
     responseData = result; 
    }); 

    return responseData; 
} 
Verwandte Themen