编辑
好,我读了here。“您无法使用异步函数返回。必须在回调中处理结果。这是由于异步编程的特性:”立即退出,设置一个将来要调用的回调函数。而且,至少对于当前的ECMAScript 5标准,您无法解决这个问题。由于JavaScript是单线程的,因此任何等待回调的尝试都只会锁定单线程,从而使回调和返回用户永远挂在事件队列中。”
今天仍然如此吗?
原始问题
在我的node.js应用程序中的函数外部访问变量时遇到问题。
const url = "mongodb://localhost:27017/";
getAllSampleTypes();
// I would like to have the variable "requested" accessible here
function getAllSampleTypes() {
MongoClient.connect(url, function (err, db) {
var dbo = db.db("myDb");
dbo.collection("data").distinct("sample_type", {}, (function (err, requested) {
// variable "requested" is accessible here
})
);
});
}
我尝试了async / await,但仍然遇到同样的问题。
function getTypes() {
MongoClient.connect(url, async function (err, db) {
let dbo = db.db("myDb");
return await dbo.collection("data").distinct("sample_type", {});
});
}
console.log(getTypes()); //Promise { undefined }
答案 0 :(得分:1)
我认为您将无法实现所需的功能。仅当您处于异步功能范围内时,异步等待才有效。您的顶级调用不在异步函数内,因此您不得不处理返回的Promise或回调。
例如getAllSampleTypes()。then(function(response){});
这里有一些与您想要的示例类似的示例,但是无论哪种方式,对异步函数的顶级调用都必须将响应作为Promise处理。
const url = "mongodb://localhost:27017/";
getAllSampleTypes().then(function(sample_types){
// Do something here.
});
async function getAllSampleTypes() {
var db = await mongo.connect(url);
var dbo = db.db("myDb");
return await dbo.collection("data").distinct("sample_type", {});
}
重要的是要了解,异步等待实际上并不是什么神奇的事情,它在幕后确实被转换为Promises。这就是为什么您对异步函数的顶级调用可以使用.then()处理响应的原因。它真的很干净阅读。上面的代码将大致翻译并执行为:
const url = "mongodb://localhost:27017/";
getAllSampleTypes().then(function(sample_types){
// Do something here.
});
function getAllSampleTypes() {
return new Promise(function(resolve, reject){
mongo.connect(url).then(function(db){
var dbo = db.db("myDb");
dbo.collection("data").distinct("sample_type", {}).then(function(results) {
resolve(results);
});
});
});
}
答案 1 :(得分:0)
getTypes不返回任何内容。你必须把它传下去 如果您要使用异步/等待,请尝试类似
async function getTypes() {
const db = MongoClient.connect(url);
const dbo = db.db("myDb");
return await dbo.collection("data").distinct("sample_type", {});
}
console.log(await getTypes());
这些可能会有所帮助: How can I use asyn-await with mongoclient和how-to-use-mongodb-with-promises-in-node-js
此外,您可能应该在某处使用db.close()关闭连接