Node / JS:奇怪的嵌套回调函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node / JS:奇怪的嵌套回调函数相关的知识,希望对你有一定的参考价值。

我遇到了这个回调函数callbackPrinter,以及它在我正在研究的Node.js项目中的用法。不确定它在做什么,特别是参考cb.apply(cb, arguments)

我很难缠绕整个callbackPrinter正在做的事情。可以简化吗?除了记录消息之外,它还在做什么?

用法:

function someFunction(callback) {
  ...
  async.parallel([
    // Some stuff
  ], callbackPrinter(message, callback))
  ...
}

功能:

function callbackPrinter (message, cb) {
  return function (err) {
    if (err) { return cb.apply(cb, arguments) }

    // Some code to log message

    cb.apply(cb, arguments)
  }
}
答案

arguments是一个阵列,cbthis

apply()方法调用具有给定this值的函数,并将arguments作为数组(或类数组对象)提供。

re:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

所以它在那里两次,第一个有条件地返回回调,第二个做东西然后回调得到apply,在那里调用它。

注意arguments对象是一个类似于Array的对象,对应于传递给函数的参数。从这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments SO因为.apply()接受那个有效的阵列对象。

另一答案

callbackPrinter函数接受error-first callback function并返回一个包装原始函数的新函数,如果在没有message的情况下调用回调,则另外记录给定的err

可以简化吗?可能如果您使用的Node.js版本足够新。 (如果你的代码库中的回调并不奇怪地使用this作为当前正在执行的函数的引用 - 传递cb作为Function.apply()的第一个参数是奇数,通常你会传递undefined。)这里是一个快速的刺:

function callbackPrinter (message, cb) {
  return (err, ...args) => {
    if (!err) {
      // log message…
    }
    return cb(err, ...args)
  }
}
另一答案
  1. 通常情况下使用.apply,你不确定运行时中的结构/计数的确切参数。在你的情况下,你不确定天气会有err
  2. 帮助您理解您的代码: 当async.parallel被调用时,callbackPrinter运行并返回函数(function (err) {..}),返回的函数将与finish/resolve triggerasync.parallel绑定。 当[ // Some stuff ]中的所有作品(async.parallel)都被运行(finished/resolved/rejected)时,将调用返回的函数。
  3. 简单的方法: const message = require('message'); const async = require('async'); function someFunction(callback) { ... async.parallel([ // Some stuff ], function(err){ if (err) { return cb.apply(cb, arguments) } // Some code to log message cb.apply(cb, arguments) }) ... }

以上是关于Node / JS:奇怪的嵌套回调函数的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 探秘 - 求异存同

重构嵌套回调、node.js、异步

异步 node.js:带有回调的嵌套数组

回调函数的使用场合

如何避免 node.js 中深度嵌套的代码?

Node.js回调函数