全局变量在forEach循环体内显示为“意外标识符”

时间:2018-07-02 00:33:35

标签: javascript node.js

我有一些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

2 个答案:

答案 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