NodeJS创建函数数组并通过async.series执行它

问题描述 投票:1回答:2

[开始在NodeJS上学习,我尝试使用async.series调用一系列函数。每个功能都是一个命令行,可以使用REST远程调用。

function TestStorageDeviceBasic()
{
    scenario = [
        'cmdline1',
        'cmdline2'
    ];

    tasks = [];
    scenario.forEach(command => { tasks.push(RunCommand(sessionId,command));});
    async.series(tasks);
}

function RunCommand(sessionId, cmdLine)
{
    var options = {
        uri: `http://${domain}/api/v1/commands`,
        method: 'POST',
        json: {
            'session-id' : `${sessionId}`,
            'command-line': `${cmdLine}` 
        }
      };

      request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            log.debug(`\"${cmdLine}\" status code successful`)
            log.debug(body);
        }
        else
            log.error(`\"${cmdLine}\" status code failed`,error);
      });
}

即使似乎调用了RunCommand函数,我也遇到了一些问题。

(node:21008) UnhandledPromiseRejectionWarning: Error: expected a function
    at wrapAsync (C:\work\MyJavascriptProject\my_sample\node_modules\async\dist\async.js:198:50)
    at C:\work\MyJavascriptProject\my_sample\node_modules\async\dist\async.js:2952:13

为什么不将RunCommand视为函数?

node.js async.js
2个回答
1
投票

这是因为您正在调用中 RunCommand,然后将其返回值推入tasks。而是推送一个进行调用的函数:

scenario.forEach(command => { 
    tasks.push(() => RunCommand(sessionId,command));
});

1
投票

您需要在代码中修改三件事

  • 将RunCommand包装在函数中,然后将其推送到任务数组中
  • 请确保在包装时传递回调
  • 也将RunCommand修改为具有回调,以便async.series可以使用回调的输出。

由于您没有传递RunCommand的回调,所以它只执行一次,因为async.series不知道何时继续。修改后的代码看起来像

function TestStorageDeviceBasic() {
  scenario = ["cmdline1", "cmdline2"];

  tasks = [];
  scenario.forEach(command => {
    tasks.push(callack => RunCommand(sessionId, command, callack));
  });
  async.series(tasks, (err, data) => {
    if (err) {
      console.error(err);
    }
    console.log(data);
  });
}

function RunCommand(sessionId, cmdLine, callack) {
  var options = {
    uri: `http://${domain}/api/v1/commands`,
    method: "POST",
    json: {
      "session-id": `${sessionId}`,
      "command-line": `${cmdLine}`
    }
  };

  request(options, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      log.debug(`\"${cmdLine}\" status code successful`);
      log.debug(body);
      callack(null, body);
    } else {
      log.error(`\"${cmdLine}\" status code failed`, error);
      callack(error, null);
    }
  });
}

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.