文章目录
一、Promise与异步编程
Promises 是异步编程的另一种选择,它的工作方式类似于在其他语言中延迟并在将来执行作
业。
异步编程的背景
JS 引擎在同一时刻只能执行一段代码,所以引擎无须留意那些“可能”运行的代码。代码会被放置在**作业队列( job queue )**中,每当一段代码准备被执行,它就会被添加到作业队列。当 JS 引擎结束当前代码的执行后,事件循环就会执行队列中的下一个作业。事件循环(event loop )是 JS 引擎的一个内部处理线程,能监视代码的执行并管理作业队列。要记住既然是一个队列,作业就会从队列中的第一个开始,依次运行到最后一个。
事件模型
当用户点击一个按钮或按下键盘上的一个键时,一个事件( event )——例如 onclick ——就被触发了。该事件可能会对此交互进行响应,从而将一个新的作业添加到作业队列的尾部。这就是 JS 关于异步编程的最基本形式。事件处理程序代码直到事件发生后才会被执行,此时它会拥有合适的上下文。
let button = document.getElementById('my-btn')
button.onclick = function(event){
console.log('clicked')
}
在此代码中, console.log(“Clicked”) 直到 button 被点击后才会被执行。当 button 被点击,赋值给 onclick 的函数就被添加到作业队列的尾部,并在队列前部所有任务结束之后再执行。
回调模式
当 Node.js 被创建时,它通过普及回调函数编程模式提升了异步编程模型。回调函数模式类似于事件模型,因为异步代码也会在后面的一个时间点才执行。不同之处在于需要调用的函数(即回调函数)是作为参数传入的。
readFile('hello.txt', function(err, contents){
if(err){
throw err
}
console.log(contents)
})
console.log('hi')
此例使用了 Node.js 惯例,即错误优先( error-first )的回调函数风格。 readFile() 函数用于读取磁盘中的文件(由第一个参数指定),并在读取完毕后执行回调函数(即第二个参数)。如果存在错误,回调函数的 err 参数会是一个错误对象;否则 contents 参数就会以字符串形式包含文件内容。
使用回调函数模式, readFile() 会立即开始执行,并在开始读取磁盘时暂停。这意味着
co