Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodej创建一个函数数组,并通过async.series执行它_Node.js_Async.js - Fatal编程技术网

Node.js nodej创建一个函数数组,并通过async.series执行它

Node.js nodej创建一个函数数组,并通过async.series执行它,node.js,async.js,Node.js,Async.js,在NodeJS上开始学习,我尝试使用async.series调用一系列函数。每个函数都是使用REST远程调用的命令行 function TestStorageDeviceBasic() { scenario = [ 'cmdline1', 'cmdline2' ]; tasks = []; scenario.forEach(command => { tasks.push(RunCommand(sessionId,comman

在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不被视为函数?

这是因为您正在调用
RunCommand
,然后将其返回值推送到
任务中。相反,按下一个进行调用的函数:

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

代码中有三件事需要修改

  • 将RunCommand包装在函数中,然后将其推入tasks数组中
  • 确保在结束时通过回调
  • 修改
    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);
    }
  });
}


希望这对您调用
RunCommand
并将函数结果推送到任务中有所帮助。
RunCommand
的结果不是函数。您可以尝试使用
.bind()
创建一个带有捕获参数的函数。关于使用异步第三方的注释:更好地使用async wait(),实际上它确实解决了问题,但在调用async.series(tasks)@isaac.hazan后只调用了第一个函数-请参阅我的答案,这就解释了为什么你会看到这种行为。希望对你有帮助。因此,在执行此操作时,我得到了堆栈跟踪的“Error:Callback已被调用”。这是我最后一个小时被困的地方。你到底是从哪里得到这个错误的?这对我来说很好。看到这个了吗?它并不完全相同,但足以给你一个想法,因为下一行使用的是
err
,而不是
error
?我已经更新了代码。同样值得检查的是,如果
log.error
行没有给出任何错误。我的代码中有一个愚蠢的错误,大括号丢失,回调总是代码。太好了,谢谢。