关于Kyle Simpson课程中getFile异步函数的技术疑问
关于Kyle Simpson的getFile函数的技术疑问解答
先给大家铺垫下背景:Kyle Simpson在Pluralsight平台上有一门优质课程,其中某模块讲解了一段能安全异步调用、保证结果按执行顺序展示的代码,核心的getFile函数如下:
function getFile(file) { var text, fn; fakeAjax(file, function(response){ if (fn) fn(response); else text = response; }); return function(cb) { if (text) cb(text); else fn = cb; } }
接下来逐个解答你的三个技术疑问:
1. 参数cb的定义位置在哪里?
cb是getFile函数返回的那个匿名函数的参数,你看代码最后一行return function(cb) { ... },这里的cb就是调用这个返回函数时传入的回调函数。举个实际使用的例子:
const readMyFile = getFile('notes.txt'); readMyFile(function(fileContent) { console.log('文件内容:', fileContent); });
这里传入的function(fileContent) {...}就是那个cb参数,它的定义就在返回的匿名函数的参数列表里,由调用者来提供具体的函数实现。
2. 若cb未定义,cb(text)是如何被调用执行的?
正常使用场景下不会出现cb未定义还调用cb(text)的情况,咱们拆解下逻辑:
- 当调用返回的函数时,如果
text已经有值(也就是fakeAjax已经拿到响应并存在text里),这时候执行cb(text)的前提是你调用函数时已经传入了cb——要是真没传,cb是undefined,调用会报错,但这属于错误使用方式,不符合这个函数的API约定。 - 另一种情况是
text还没值,这时候会把fn赋值为cb,等后续fakeAjax的回调触发时,再调用fn(response)——这时候fn已经是你传入的cb,肯定是有定义的。
简单说,这个函数的设计默认调用者会正确传入回调函数,合规使用下不会出现无定义调用的问题。
3. 调用getFile函数时,response是如何获取到具体值的?
response来自fakeAjax这个模拟异步请求的工具函数的回调参数。你看getFile里第一时间就调用了fakeAjax(file, function(response){ ... }),这里的第二个参数是一个匿名回调——当fakeAjax完成模拟的异步操作(比如模拟读取本地文件、发起网络请求),它会把预设好的文件内容/请求结果作为response参数传入这个回调,咱们的代码也就拿到了这个值,要么存在text里暂存,要么直接传给fn(也就是后来传入的cb)。
fakeAjax是课程里用来模拟真实异步流程的函数,内部应该做了延迟处理,模拟真实Ajax的异步回调逻辑。
内容的提问来源于stack exchange,提问作者Alex Gordon
相关产品推荐
相关产品推荐

