在上一篇中我們梳理了koa當(dāng)中中間件的洋蔥模型執(zhí)行原理,并實(shí)現(xiàn)了一個(gè)可以讓洋蔥模型自動(dòng)跑起來(lái)的流程管理函數(shù)。這一篇,我們?cè)賮?lái)研究一下koa當(dāng)中異步回調(diào)同步化寫法的原理,同樣的,我們也會(huì)實(shí)現(xiàn)一個(gè)管理函數(shù),是的我們能夠通過(guò)同步化的寫法來(lái)寫異步回調(diào)函數(shù)。

1. 回調(diào)金字塔及理想中的解決方案

我們都知道javascript是一門單線程異步非阻塞語(yǔ)言。異步非阻塞當(dāng)然是它的一個(gè)優(yōu)點(diǎn),但大量的異步操作必然涉及大量的回調(diào)函數(shù),特別是當(dāng)異步嵌套的時(shí)候,就會(huì)出現(xiàn)回調(diào)金字塔的問(wèn)題,使得代碼的可讀性非常差。比如下面一個(gè)例子:

var fs = require('fs');fs.readFile('./file1', function(err, data) {
  console.log(data.toString());
  fs.readFile('./file2', function(err, data) {
    console.log(data.toString());
  })})

這個(gè)例子是先后讀取兩個(gè)文件內(nèi)容并打印,其中file2的讀取必須在file1讀取結(jié)束之后再進(jìn)行,因此其操作必須要在file1讀取的回調(diào)函數(shù)中執(zhí)行。這是一個(gè)典型的回調(diào)嵌套,并且只有兩層而已,在實(shí)際編程中,我們可能會(huì)遇到更多層的嵌套,這樣的代碼寫法無(wú)疑是不夠優(yōu)雅的。

在我們想象中,比較優(yōu)雅的一種寫法應(yīng)該是看似同步實(shí)則異步的寫法,類似下面這樣:

var data;data = readFile('./file1');//下面的代碼是第一個(gè)readFile執(zhí)行完畢之后的回調(diào)部分console.log(data.toString());//下面的代碼是第二個(gè)readFile的回調(diào)data = readFile('./file2');console.log(data.toString());

這樣的寫法,就完全避免回調(diào)地獄。事實(shí)上,koa就讓我們

網(wǎng)友評(píng)論