回调函数调用机制与异步JS提交数统计实现的正确性问询
问题拆解与代码修正
咱们一步步来梳理你的问题,先看代码的问题,再解答你关心的几个疑问~
一、原代码的错误点
你的代码目前没法正确实现需求,有几个关键问题:
- getRepositories未调用callback:异步函数里不能直接
return结果,因为setTimeout是异步的,函数会先执行完返回,而setTimeout里的逻辑是之后才运行的。必须通过传入的callback函数把结果传递出去,不然外层拿不到仓库列表。 - getCommits参数缺失:你调用
getCommits(repo , (commits)=>{ ... }),但函数定义是function getCommits(repo){ ... },没有接收callback参数,而且同样是直接return,没法把提交记录结果传递给上层。 - 语法错误:
getRepositories函数少了一个闭合的},导致代码语法不合法。
二、你的疑问解答
1. 调用getUser()后,后续执行的是lambda函数还是实际函数?
调用getUser(1, (user)=>{ ... })后,当getUser内部的setTimeout异步操作完成(2秒后),会执行你传入的那个lambda匿名函数(也就是(user)=>{ ... })。这个lambda就是你传给getUser的callback参数,getUser内部会在合适的时机调用它。
2. 回调函数是如何被调用的?
回调函数的调用逻辑是这样的:
- 你调用
getUser(1, callback1),把lambda函数作为callback1传进去; - getUser内部的setTimeout等待2秒后,先执行
console.log('Reading user from database'),然后调用callback1({id: id, githubUsername: 'myName'}),把模拟的用户对象作为参数传给callback1; - callback1内部又调用
getRepositories(user.githubUsername, callback2),把另一个lambda作为callback2传进去; - getRepositories内部的setTimeout等待2秒后,执行
console.log('Retrieving repos'),然后调用callback2(['repo1','repo2']),把模拟的仓库列表传给callback2; - callback2内部遍历每个仓库,调用
getCommits(repo, callback3),把处理提交记录的lambda作为callback3传进去; - getCommits拿到repo后,调用
callback3(['commit1','commit2']),把模拟的提交列表传给callback3,最后在callback3里统计数量并打印。
三、修正后的可运行代码
这里把代码修正后,就能实现打印每个仓库的提交记录数量的需求:
getUser(1, (user)=>{ getRepositories(user.githubUsername, (repos)=>{ // 遍历每个仓库,获取提交记录数量 repos.forEach(repo => { getCommits(repo , (commits)=>{ console.log(`仓库 ${repo} 的提交记录数量:${commits.length}`); }); }); }); }); // 修正getCommits,添加callback参数并模拟异步返回结果 function getCommits(repo, callback){ setTimeout(() => { callback(['commit1','commit2']); }, 1000); } // 修正getRepositories,用callback传递结果,补全闭合的} function getRepositories(username, callback){ setTimeout(()=>{ console.log('Retrieving repos'); callback(['repo1','repo2']); },2000); } function getUser(id,callback){ setTimeout(()=>{ console.log('Reading user from database'); callback({id: id, githubUsername: 'myName'}); },2000); }
运行这段代码后,你会看到如下输出:
Reading user from database Retrieving repos 仓库 repo1 的提交记录数量:2 仓库 repo2 的提交记录数量:2
内容的提问来源于stack exchange,提问作者Zaham2
相关产品推荐
相关产品推荐

