【问题标题】:How do I use a callback in a nested function in Node?如何在 Node 的嵌套函数中使用回调?
【发布时间】:2019-02-08 14:09:57
【问题描述】:

我收到“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 的函数时发现错误(另一个回调错误)。我会尽快进行编辑并发布正确的代码。你所有的问题都帮助我找到了答案。谢谢!

【问题讨论】:

  • 在第二段代码中,callback 定义在哪里?这很可能是问题所在。错误指向哪里?
  • 好电话。我忘了包含一个包装第二段代码的函数。我现在将进行编辑。道歉。
  • 我们需要查看callback 的来源,因为显然传递的不是函数。 checkAudioInfo 是从哪里得到callback 的?
  • 你能指定是哪一行导致了错误吗?有两个地方使用了“回调”,这可能会造成混淆。
  • 如果我将ffprobe 替换为代理,我将无法重现该问题。我确实收到了关于 ffprobeStatic.path 未定义的错误,但在将其更改为 null 后,一切正常。所以我认为问题不在于显示的代码。如果您不喜欢使用 node.js 样式的回调,可以使用 util.promifisy 将它们转换为 Promise,从而缩短整个链条。

标签: javascript node.js asynchronous callback ffprobe


【解决方案1】:

您的第一个代码块接受回调。第二个参数应该是一个函数。该函数会在异步代码完成后调用。

您的第二个代码块调用第一个中的函数。您传递的第二个参数是一个函数。到目前为止,一切顺利。

在该函数中,您尝试调用callback。这失败了,因为范围内没有具有该名称的变量。

此时,您还不清楚您要做什么。您传递的函数回调。您应该使用它对第一个代码块中的代码传递的数据进行有用的操作

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

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

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


重新编辑:

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

function checkAudioInfo(metadata_json, callback) {

这更有意义。

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

【讨论】:

  • 你的提问让我意识到我错误地传递了我对 checkAudioInfo 的调用。谢谢您的帮助!我会尽快发布解决方案。
【解决方案2】:

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

metadata_json 是什么?你的意思是info

【讨论】:

  • @indigo 您是否更改了问题描述?现在它看起来不一样了!
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多