我见过一篇有关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?
答案 0 :(得分:3)
回调-回调是要在另一个函数完成执行之后执行的函数
这不是“回调”的正确定义。除非您没有引用该定义,否则我不会继续使用您从中获得的任何资源。
一个相当广泛的回调定义是:
有些人可能会争辩一个狭窄的定义:
回调示例:
Array.prototype.sort
的函数以比较数组元素。 (广义和狭义的定义。)new Promise
的函数以启动promise将观察到的异步操作(称为“承诺执行者函数”)。 (广义和狭义的定义。)Array.prototype.map
的函数来转换元素。 (广义和狭义的定义。)then
,catch
或finally
方法的函数。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
}
如果函数名称与您要导出的名称相同,则无需为键指定值。