编辑
好吧,我读了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 }
我认为你无法实现你想要的目标。异步等待仅在您处于异步功能范围内时才起作用。您的顶级调用不在异步函数内,因此您将被迫处理返回的Promise或回调。
例如getAllSampleTypes(),然后(功能(响应){})。
以下是一些与您想要的类似的示例,但无论哪种方式,对异步函数的顶级调用都必须将响应作为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);
});
});
});
}
getTypes不返回任何内容。你必须把它传递出来如果你要使用async / await尝试类似的东西
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()的连接