我正在浏览以下代码,并且无法理解在调用每个方法时幕后发生的事情。两种方法如何相互作用?
var employeeDb = require('../database/employees');
exports.getEmployees = getEmployees;
exports.getEmployee = getEmployee;
function getEmployees(callback) {
setTimeout(function() {
callback(null, employeeDb);
}, 500);
}
function getEmployee(employeeId, callback) {
getEmployees(function(error, data) {
if (error) {
return callback(error);
}
var result = data.find(function(item) {
return item.id === employeeId;
});
callback(null, result);
});
}
任何人都可以详细解释一下吗?
答案 0 :(得分:0)
Staff
从var employeeDb = require('../database/employees');
导出的内容现在已分配给../database/employees
。
employeeDb
我们选择将我们的exports.getEmployees = getEmployees;
exports.getEmployee = getEmployee;
和getEmployees
方法从下面导出到我们当前正在处理的文件getEmployee
。由于函数提升,这两种方法已经存在于JavaScript引擎的眼中。
require
传递到function getEmployees(callback) {
setTimeout(function() {
callback(null, employeeDb);
}, 500);
}
的任何回调函数将在至少500ms过后执行....该函数必须期望getEmployees
和null
(来自第一行的employeeDb
语句)。
如果这是Node.js代码,通常会将require
传入回调以指示“我们遇到了没有错误!”。
null
此功能接受function getEmployee(employeeId, callback) {
getEmployees(function(error, data) {
if (error) {
return callback(error);
}
var result = data.find(function(item) {
return item.id === employeeId;
});
callback(null, result);
});
}
和employeeId
功能。该函数说,'嘿callback
,请立即运行,但是当你完成后,执行这个匿名函数我给你作为唯一的参数。 getEmployees()
设置一个500毫秒的计时器,一旦500毫秒到期,它决定通过给它getEmployees()
和null
来运行我们的匿名函数。
我们的匿名函数接受employeeDb
为null
(来自参数),var error
为employeeDb
(来自参数)。自var data
提供给我们后,null
条件失败,允许我们转到if(error){}
代码行。
var result...
代码行说:“嘿var result...
,请运行您的data
方法,并执行您应该对匿名函数执行的操作..是否是在你完成时运行它(也就是异步),或者它是否同步运行多次(如find
循环)。“
如果forEach
是异步操作,那么您的data.find()
就在错误的位置。
如果callback(null, result
是一个同步操作,那么最初作为参数传入的回调将被执行为:“嘿,我们没有错误,所以lemme给你data.find()
代替所以你知道那......而且哦,这也是null
我得到的,再见!“
答案 1 :(得分:0)
此代码似乎是一种模拟代码,它模拟了一些可以访问数据库的服务器端API( getEmployees 和 getEmployee )。让我对这两个API函数给出一个非常简短的逻辑解释:
此功能使用 setTimeout 功能模拟服务器端通信的延迟。调用此函数时,参数 callback 在500毫秒后调用两个参数; 错误和员工数据库(employeeDb)对象。
调用此函数以查找具有给定id( employeeId )且具有回调机制的员工。 API使用先前的服务器端访问API并将回调传递给它。每当服务器通过回调返回数据时,它就会调用getEmployee API推送的数据库对象的find方法。找到具有给定id的员工后,结果将通过回调机制返回。在此代码中,假设在 find 操作期间没有生成错误。