javascript - NodeJS异步/等待命令不起作用
问题描述
我是NodeJS和Promises的新手,所以我可能不明白它是如何工作的。
我正在我的应用程序中加载一个配置文件,其特点是如果它不存在,我会使用来自数据库调用的信息来创建它。
function getConfig(clientId, app) {
return new Promise(async (resolve, reject) => {
await fs.access(config.files.url_networks_file, async function(err) {
if (err) {
try {
await loadClientConfig(clientId);
} catch (e) {
reject(e);
}
}
});
fs.readFile(config.files.url_networks_file, 'utf8', function(err, data) { // Try to read network's configuration file
if (err) { // If file doesn't exists
reject(err);
} else if (JSON.parse(data)[app]) { // In case app's config exists
resolve(JSON.parse(data)[app]);
} else { // In case app's config doesn't exists
reject(new Error('There\'s no configuration for app: ' + app));
}
});
});
}
我的问题是它fs.readFile()
不会等到loadClientConfig()
完成,所以它总是返回“找不到文件”。如果配置文件已经存在,它可以完美运行。
我试过把回调放在fs.readFile()
里面fs.access()
,仍然没有得到任何东西(即使文件存在)。
更新
仍然无法使用我收到的两种解决方案。我正在发布我为每个人制作的代码,以检查我是否在编码中丢失了一些东西:
@昆汀
async function loadClientConfig(clientId) {
return new Promise((resolve, reject) => {
fs.access(config.files.url_networks_file, function (err) {
if (err) {
try {
sql.close();
sql.connect(config.database.credentials, function (err) {
if (err) {
reject(err);
} else {
var request = new sql.Request();
request.input('clientId', clientId);
query = config.database.queries.all;
request.query(query, function (e, data) {
if (e) {
reject(e);
} else {
try {
resolve(writeConfigFile(data.recordset));
} catch (err) {
reject(err);
}
}
});
}
});
} catch (e) {
reject(e);
}
}
});
});
};
async function getConfig(clientId, app) {
return new Promise(async (resolve, reject) => {
try {
await loadClientConfig(clientId);
} catch (e) {
reject(e);
}
fs.readFile(config.files.url_networks_file, 'utf8', function(err, data) { // Try to read network's configuration file
if (err) { // If file doesn't exists
reject(err);
} else if (JSON.parse(data)[app]) { // In case app's config exists
resolve(JSON.parse(data)[app]);
} else { // In case app's config doesn't exists
reject(new Error('There\'s no configuration for app: ' + app));
}
});
});
}
@dasfdsa
async function loadClientConfig(clientId) {
return new Promise((resolve, reject) => {
sql.close();
sql.connect(config.database.credentials, function(err) {
if (err) {
reject(err);
} else {
var request = new sql.Request();
request.input('clientId', clientId);
query = config.database.queries.all;
request.query(query, async function(e, data) {
if (e) {
reject(e);
} else {
try {
resolve(writeConfigFile(data.recordset));
} catch (err) {
reject(err);
}
}
});
}
});
});
};
async function getConfig(clientId, app) {
await new Promise((resolve, reject) => {
fs.access(config.files.url_networks_file, async function (err) {
if (err) {
try {
let temp = await loadClientConfig(clientId); /*Now that you told me its async, we will await it as well*/
resolve(temp);
} catch (e) {
reject(e);
}
} else {
resolve();
}
});
});
let configuration = await new Promise((resolve, reject) => {
fs.readFile(config.files.url_networks_file, 'utf8', function (err, data) { // Try to read network's configuration file
if (err) { // If file doesn't exists
reject(err);
} else if (JSON.parse(data)[app]) { // In case app's config exists
resolve(JSON.parse(data)[app]);
} else { // In case app's config doesn't exists
reject(new Error('There\'s no configuration for app: ' + app));
}
});
});
return configuration;
}
更新 2
调试时似乎有效,我正在使用VSCode。我认为这可能是超时问题或类似问题。
解决方案
代码:awaited
promise
每个回调两个单独的。getConfig
返回promise
将解析为config
.
async function getConfig(clientId, app) {
await new Promise((resolve, reject) => {
fs.access(config.files.url_networks_file, async function (err) {
if (err) {
try {
let temp = await loadClientConfig(clientId);/*Now that you told me its async, we will await it as well*/
resolve(temp);
} catch (e) {
reject(e);
}
}
});
});
let config = await new Promise((resolve, reject) => {
fs.readFile(config.files.url_networks_file, 'utf8', function (err, data) { // Try to read network's configuration file
if (err) { // If file doesn't exists
reject(err);
} else if (JSON.parse(data)[app]) { // In case app's config exists
resolve(JSON.parse(data)[app]);
} else { // In case app's config doesn't exists
reject(new Error('There\'s no configuration for app: ' + app));
}
});
});
return config;
}
编辑:我已经编辑到 await ,如果返回一个承诺loadClientConfig()
,上面的代码应该可以正常工作 。loadClientConfig
推荐阅读
- ios - 弹出时如何显示带有动画的标签栏?(iPhone X)
- google-app-engine - 如何在 Google 应用引擎中增加 client_max_body_size?
- liquibase - Liquibase:无法识别数据类型 CLOB
- c - 使用链表将两个多项式相乘的程序
- json - 使用复制命令将 Json 文件加载到 redshift
- javascript - 使用 echarts 图表继续强调点击
- javascript - Redux Thunk 用于简单的异步请求
- acumatica - 为什么在插入和更新新行时出现重复行?
- java - Git - 将存储库推送到heroku失败(java应用程序)
- javascript - forEach() 方法的估计完成时间