如何在Node的嵌套函数中使用回调?

时间:2018-09-03 13:49:14

标签: javascript node.js asynchronous callback ffprobe

我收到“ TypeError:回调不是函数”,这使我相信我误解了如何在嵌套函数中使用回调。

功能:

function getAudioInfo(filePath, callback) {
  ffprobe(filePath, { path: ffprobeStatic.path }, function (err, info) {
    console.log("ffprobe output: " + JSON.stringify(info));
    if (err) {
      console.log("getAudioInfo error: " + err);
      callback(err, null);
    } else {
      callback(null, info);
    }
  });
}

致电:

   function checkAudioInfo(metadata_json, callback) {

      var filePath = metadata_json['current_path'];

      getAudioInfo(filePath, function(err, info) {
          if (err) {
            callback(err);
          }
          //operations on info
          callback(null, metadata_json);
      });//end getAudioInfo

    }//end checkAudioInfo

这是对回调的不当使用吗?

编辑:

在传递给包装checkAudioInfo的函数时发现错误(另一个回调错误)。我将进行编辑,并在不久后发布正确的代码。您的所有问题都帮助我找出了答案。谢谢!

2 个答案:

答案 0 :(得分:2)

您的第一段代码接受回调。第二个参数应该是一个函数。完成异步代码后,将调用此函数。

您的第二个代码块在第一个代码块中调用该函数。您要传递的第二个参数是一个函数。到目前为止,一切都很好。

在该函数中,您尝试调用callback。之所以失败,是因为在作用域中没有该名称的变量。

在这一点上,目前还不清楚您要做什么。您传递的功能。您应该使用它来对第一个代码块中的代码所传递的数据做一些有用的事情。

现在,您可以使用命名函数表达式获得对回调函数的引用:

  getAudioInfo(filePath, function callback (err, info) {
      if (err) {
        callback(err);
      }
      //operations on info
      callback(null, metadata_json);
  });//end getAudioInfo

...但是您只是递归和无限地调用它,这没有用。


重新编辑:

您现在添加了一个名为callback second 变量:

function checkAudioInfo(metadata_json, callback) {

这更有意义。

如果未定义那个 callback,那是因为您在调用 checkAudioInfo时没有传递值。您尚未包含该代码。

答案 1 :(得分:0)

函数本身function(err, info)是在getAudioInfo内部调用的回调!

什么是metadata_json?您是说info吗?