Javascript NodeJS异步/等待订单不工作
我对NodeJS和承诺是新手,所以我可能不了解它是如何工作的 我正在我的应用程序中加载一个配置文件,其特点是,若它不存在,我将通过调用数据库来创建它Javascript NodeJS异步/等待订单不工作,javascript,node.js,async-await,es6-promise,Javascript,Node.js,Async Await,Es6 Promise,我对NodeJS和承诺是新手,所以我可能不了解它是如何工作的 我正在我的应用程序中加载一个配置文件,其特点是,若它不存在,我将通过调用数据库来创建它 function getConfig(clientId, app) { return new Promise(async (resolve, reject) => { await fs.access(config.files.url_networks_file, async function(err) { if (er
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()
finish,所以它总是返回“file not found”。如果配置文件已经存在,那么它可以正常工作
我尝试将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。我认为这可能是超时问题或类似问题。你只能等待承诺
fs.access
不返回承诺(它需要回调)。(由于问题中未包含该函数,因此无法说明loadClientConfig
的作用)
如果您想
等待它,那么您需要将它包装在一个函数中,该函数返回一个承诺。您只能等待一个承诺
fs.access
不返回承诺(它需要回调)。(由于问题中未包含该函数,因此无法说明loadClientConfig
的作用)
如果您想等待它,那么您需要将它包装在一个函数中,该函数返回一个承诺。代码:对于每个回调,两个独立的等待的承诺getConfig
返回将解析为config
的promise
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;
}
编辑:我已经编辑了等待loadClientConfig()
,如果loadClientConfig
返回承诺,上述代码应该可以正常工作。代码:对于每个回调,两个独立的等待
承诺
getConfig
返回将解析为config
的promise
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;
}
编辑:我已编辑等待loadClientConfig()
,如果loadClientConfig
返回承诺,上述代码应该可以正常工作。传递给fs.access()
的回调会绊倒你。doesfs.access
返回承诺(提示:否)传递给fs.access()的回调
正在绊倒你。是否fs.access
返回承诺(提示:否)我已尝试移动fs.access
,但仍然无法工作:等待loadClientConfig(clientId)
fs.readFile(config.files.url_networks_file,'utf8',function(err,data){//尝试读取网络的配置文件
`if(err){//if文件不存在``拒绝(err);`}else if(JSON.parse(data)[app]){//如果app的配置存在``解析(JSON.parse(data)[app].`}else{//如果应用程序的配置不存在``拒绝(新错误('app:'+app'没有配置));``}“@AndrésMarotta-我说过你需要用一个承诺来包装fs.access,但你没有。loadClientConfig
是一个返回承诺的函数,不是你让我这么做的吗?我几乎用我所有的函数来做,而且工作很好,总是有一个try-catch块。@AndrésMarotta-你想要fs.readFile
等到fs.access
已完成。fs.access
不会返回承诺。我将发布解决方案,以便更容易查看。我已尝试移动fs.access
,但仍然无法工作:等待loadClientConfig(clientId);
fs.readFile(config.files.url\u networks\u file,'utf8',函数(err,data){//尝试读取网络的配置文件
`if(err){//if文件不存在``拒绝(err);`}否则if(JSON.parse(data)[app]){//如果app的配置存在``解析(JSON.parse(data)[app]);``}否则{//如果app的配置不存在``拒绝(新错误('app:'+app'没有配置];`}})“@AndrésMarotta-我说过你需要用一个承诺来包装fs.access,但你没有。loadClientConfig
是一个返回承诺的函数,不是你让我这么做的吗?我几乎用我所有的函数来做,而且工作很好,总是有一个try-catch块。@AndrésMarotta-你想要fs.readFile
等到fs.access
已完成。fs.access
不会返回承诺。我将发布解决方案,以便于查看。感谢您的评论。我将删除它。如果loadClientConfig(clientId)中有任何错误
它将转到下一个catch块,承诺将被拒绝。loadClientConfig
是一个异步函数吗?是的,它是一个异步函数。我没有收到任何错误,即使在控制台中也没有。如果我编码错误,我可以用gaven解决方案更新我的答案。它会返回承诺吗?如果是,我现在编辑的代码会正常工作。我尝试了您的解决方案进行了一些小的修改,最终使其正常工作。原来问题是nodemon
,我不知道为什么,但使用node
或甚至使用de-VS-code启动服务器,效果很好!谢谢!谢谢您的评论。我将删除它。如果loadClientConfig(clientId)中有任何错误
它将转到下一个catch块,承诺将被拒绝。loadClientConfig
是一个异步函数吗?是的,它是一个异步函数。我没有收到任何错误,即使在控制台中也没有。如果我编码错误,我可以用gaven解决方案更新我的答案。它会返回承诺吗?如果是,我现在编辑的代码会正常工作。我尝试了您的解决方案只需稍作修改