我有一些Java代码要重构。给我带来麻烦的变量是Server
变量,它是我创建的自定义模块。由于某些原因,当解释器尝试评估forEach循环的第一行时,Server
变量将返回为“未标识的标识符”。这是无效的新重构代码:
'use strict';
const Config = require('config');
const Server = require('./server');
let servers = [];
async function start() {
const services = Config.get('app.services');
try {
services.forEach(service => {
// An error is returned with this next line saying Server is an "unidentified identifier"
let server = await Server.deployment(service.host, service.port);
await server.start();
servers.push(server);
});
} catch (err) {
console.log('an error has been caught');
console.log(err);
process.exit(1);
}
servers.forEach(server => {
console.log(`Server running at ${server.info.uri}`);
});
};
这是我之前运行的代码:
async function start() {
try {
// Server works as anticipated here.
const server = await Server.deployment(Config.get('app.host'), Config.get('app.port'));
await server.start();
servers.push(server);
const server2 = await Server.deployment(Config.get('app.host'), 3031);
await server2.start();
servers.push(server2);
} catch (err) {
console.log('an error has been caught');
console.log(err);
process.exit(1);
}
servers.forEach(server => {
console.log(`Server running at ${server.info.uri}`);
});
};
正如您在此处看到的,我想将服务器配置移至元数据文件,然后仅使用forEach循环创建所需的服务器部署。
任何人都可以解释为什么会失败并提供有关如何有效编码的提示吗?
编辑1:为清楚起见添加了确切的错误消息。
let server = await Server.deployment(service.host, service.port);
^^^^^^ SyntaxError: Unexpected identifier
答案 0 :(得分:4)
您只能在await
函数内使用async
-您的forEach
回调目前还不是async
,因此当您尝试使用{时会引发错误{1}}里面。但是,仅将await
回调更改为异步可能不会做您想要的事情-而是将每个forEach
初始化的map
初始化为service
并调用Promise
承诺的数组。也不需要全局Promise.all
变量:
servers
答案 1 :(得分:1)
这里是另一个答案的一种变体,它使用for
循环而不是.forEach()
循环,以便您可以顺序地遍历服务器,而不必并行进行。与.forEach()
不同,for
函数内的async
循环将暂停await
。这也使代码更简单。
async function start() {
const services = Config.get('app.services');
const servers = [];
try {
for (let service of services) {
const server = await Server.deployment(service.host, service.port);
servers.push(server);
await server.start();
console.log(`Server running at ${server.info.uri}`);
});
} catch (err) {
console.log('an error has been caught', err);
process.exit(1);
}
return servers;
}
选择另一个答案,否则这个答案将起作用。我只是想向您展示如何与for
一起使用await
循环来简化事情,而.forEach()
不会暂停await
。