node.js - 如何在 Node JS 中的回调之外使用变量?
问题描述
我对节点 js 不切实际。我有以下代码:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("test").findOne(
{},
{ sort: { _id: -1 } },
(err, data) => {
console.log(data);
},
);
db.close();
});
我想在 MongoClient.connect() 的范围之外使用变量“数据”。问题应该是使用了回调函数,因此是异步执行的。
如果我做这样的事情:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var x;
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("test").findOne(
{},
{ sort: { _id: -1 } },
(err, data) => {
console.log(data);
x = data;
},
);
db.close();
});
console.log(x);
x 的结果将是“未定义的”。
一般如何解决这个问题?您如何使用特定范围之外的变量以伪同步方式执行代码?
解决方案
您可以使用 async 并等待将此异步代码转换为同步代码,
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var x;
(async ()=>{
await MongoClient.connect(url, (err, db) => {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("test").findOne(
{},
{ sort: { _id: -1 } },
(err, data) => {
console.log(data);
x = data;
},
);
db.close();
});
})();
console.log(x);
了解更多,
https://tylermcginnis.com/async-javascript-from-callbacks-to-promises-to-async-await/ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/异步函数
推荐阅读
- c# - 为什么我不能使用此 ForEach 循环将整数分配给数组(抛出“未设置对象引用”异常)
- flutter - 读取继承自 stateNotifier 的类中的状态
- python - 合并两个排序的python列表
- javascript - 如果使用Angular为空日期选择器,如何禁用按钮
- c++ - 如何将函数调用与回调同步?
- sql - 使用SQL将数据从阿拉伯语翻译成英语,数据库是oracle
- google-api - 无法在 Google Calendar API 中获取我拥有的列表
- spring-boot - 使用 springboot_springdata_JPA 生成动态查询时面临问题。未生成所需的查询
- python - 堆叠列
- database - Laravel DB 事务和事件