回调和模块导出有什么区别?

时间:2019-04-28 12:19:24

标签: javascript node.js

我见过一篇有关javascript中回调的文章。 https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced我知道我可以通过阅读这篇文章来理解它。但是,在研究node.js

中的模块导出时,我对回调感到困惑

回调-A callback is a function that is to be executed after another function has finished executing

javascript中回叫

function doHomework(subject, callback) {
  console.log(`Starting my ${subject} homework.`);
  callback();
}

doHomework('math', function() {
  console.log('Finished my homework');
});

node.js中的模块导出

// app.js

const logger = require('./logger');

logger.log(10, 10);

// logger.js

const multiply = require('./multiplication');

function log(valueOne, valueTwo) {
  multiply('The result is ', valueOne, valueTwo);
}

module.exports.log = log;

//

function multiply(speech, valueOne, valueTwo) {
  let result = valueOne * valueTwo;

  return console.log(speech + result);
}

module.exports = multiply;

并在我的终端上运行node app.js

我从运行node app.js得到的结果是The result is 100,这是正确的。

但是我的问题是 Does the approach that I did on the node app is consider as callback as well?

2 个答案:

答案 0 :(得分:3)

  

回调-回调是要在另一个函数完成执行之后执行的函数

这不是“回调”的正确定义。除非您没有引用该定义,否则我不会继续使用您从中获得的任何资源。

一个相当广泛的回调定义是:

  • 回调是您传递给其他东西(作为函数参数,属性值等)的函数,当满足其定义的调用函数的条件时,另一件事将调用该函数。

有些人可能会争辩一个狭窄的定义:

  • 回调是一个传递给另一个函数的函数,供另一个函数在满足其定义的条件时进行回调。

回调示例:

  1. DOM事件处理程序,尽管我们通常将其称为“处理程序”,而不是回调。 (宽泛的定义。)
  2. 您传递给Array.prototype.sort的函数以比较数组元素。 (广义和狭义的定义。)
  3. 您传递给new Promise的函数以启动promise将观察到的异步操作(称为“承诺执行者函数”)。 (广义和狭义的定义。)
  4. 您传递给Array.prototype.map的函数来转换元素。 (广义和狭义的定义。)
  5. 您传递给诺言的thencatchfinally方法的函数。
  6. 打开文件后(或操作失败),Node.js将调用传递给fs.openFile的函数。 (广义和狭义的定义。)

...还有许多其他人。

请注意,其中许多(2、3和4)在调用它们的函数完成执行之前被调用

  

我在节点应用程序上执行的方法是否也被视为回调?

不。尽管您在multiply中使用了log,但这只是您从log调用的函数,而不是回调。这将是一个回调:

function multiply(a, b, cb) {
    cb(a * b);
}
function showResult(msg) {
    console.log(msg);
}

multiply(7, 6, showResult);

showResult用作调用multiply时的回调。

答案 1 :(得分:1)

我不完全理解您的问题。但是,据我所知,module.exports并未明确使函数成为回调函数。 module.exports的目的是在需要相关的.js文件时允许访问该功能……如您的示例所示。

您的log()函数不是回调函数,因为您只是传递参数,然后使用这些值调用multiply函数并输出结果。

当您调用multiply函数时,您只是在这样调用它:

multiply('some text', 10, 10)

要使其成为回调,必须使用一个函数作为其最终参数,即:

multiply('some text', 10, 10, function(err, data) {
    // ...
})

这也适用于log函数以及与此相关的任何函数。 因此,除非函数的最终参数是函数,否则它不是回调。 module.exports纯粹允许访问该功能或您在对象中指定的功能,例如:

module.exports = {
functionOne: someFunctionName,
functionTwo,
functionThree
}

如果函数名称与您要导出的名称相同,则无需为键指定值。