それはそれの文法を学ぶために、ソースコードを見ているので、メモリは非常に貧しい人々の記録であるため、より頻繁にアイデアを参照してくださいソースコードを見て、私たちは、たくさんのES6の構文を使用しkoa2。KOAソースを読んだ後、タマネギのコアが呼び出されます。だから私は自分の将来を見てそれを簡素化するためにコードの一部を分離う突然脳卒中を再思考する必要はありません時間を思い出しました。
- 最初のストレージアレイのミドルウェア機能を作成します
- 配列後の配列へのapp.useミドルウェアミドルウェアは、サービスを開始する準備ができています
- 後でコールバックサービスコールを開始し、ミドルウェアは、再帰的な配列のミドルウェアを行い、
- 実行返す約束した後、
- 私は、それぞれの方法ではないアプリケーションに、アプリケーションのインスタンスであると仮定すると、独立した機能、およびコードとコードコンソールを検証する原作者の一部を削除するには、この順になります。書き込みます。独立の
ミドルウェアは、インスタンスに空の配列を作成し、
use(fn) {
if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
if (isGeneratorFunction(fn)) {
fn = convert(fn);
//转换为async 函数
}
this.middleware.push(fn);
return this;
//返回新实例
}
复制代码
使用方法は、ミドルウェア内のすべてのミドルウェアを置くことです。
app.listen(3000, () => {
})
复制代码
配列は、サービスを開始する準備ができたら
listen(...args) {
const server = http.createServer(this.callback());
return server.listen(...args);
}
复制代码
ノードサーバはコールバックを呼び出して作成します。
callback() {
const fn = compose(this.middleware);
if (!this.listeners('error').length) this.on('error', this.onerror);
const handleRequest = (req, res) => {
const ctx = this.createContext(req, res);
return this.handleRequest(ctx, fn);
};
return handleRequest;
}
复制代码
で構成するためのコールバック呼び出しでコールバックメソッド
function compose (middleware) {
//middleware 回调数组
return function (context, next) {
// last called middleware #
let index = -1;
return dispatch(0)
}
//返回一个prm状态
}
复制代码
オブジェクトは、再帰呼び出しの完了の結果を伝えることを約束を返します。
function dispatch (i) {
if (i <= index) return Promise.reject(new Error('next() called multiple times'))
//判断如果i小于index直接返回错误
index = i;
let fn = middleware[i]; //取出数组中对应下标函数
if (i === middleware.length) fn = next;
if (!fn) return Promise.resolve();
try {
return Promise.resolve(fn(context, function next () {
return dispatch(i + 1)
//递归调用
}))
} catch (err) {
return Promise.reject(err)
}
}
因为是async 所以当 await 接收到返回的Promise结果以后就会逐个执行下去 ,
也就是说当async函数被逐个执行完毕以后返回一个Promise对象,那么就会从async函数最后一个await逐个向上返回调用,直到所有await执行完毕。
这就是洋葱式调用
async function(){
await fun1(async function() {
await fun2(async function() {
await fun3(async function(){
return Promise.resolve();
});
});
});
};
上一级的await一直在等待下一级的返回结果,所以逐级向下执行,在等到执行了Promise.resolve();有了返回结果以后再逐级向上返回
//
复制代码
特定のは、再帰呼び出しを行います
handleRequest(ctx, fnMiddleware) {
return fnMiddleware(ctx).then(handleResponse).catch(onerror);
//fnMiddleware 就是递归执行完毕以后返回prm对象接收一个函数
}
//callback里调永compose函数并将middleware传递过去
复制代码
//オブジェクトの最後の行は、実際に返されるFN
概要
新機能、非同期の結果を待っている一つ一つの非同期機能の新機能ES7を使用することで一つ下の1は非常にソースコードを読むために持って、上位層に伝えるタマネギ・コールの形成を伝えるために一度KOAのアイデアは、実際には、結果が返されます非同期機能を学び、読書におけるので、彼らはまた、非常に良いまだ、学びながら、非同期機能を検討しました。あなたはこの関数は作品への再帰呼び出しで混乱も理解していない場合は再帰呼び出しが終わった後、その結果を順に返されますなぜ、私は理解できないだろう。私は、彼らが他のパッケージのkoa2核となるアイデアを知ってもらう場合でも、いくつかの機能があり、あなたがあなたの時間を取ることができることを知ってもらうと思います
app.use(async (ctx, next) => {
console.log(1)
//典型语法await在等待
await next();
console.log(2)
});
app.use(async (ctx, next) => {
console.log(3)
//典型语法await在等待
await next();
console.log(5)
});
返回结果 是 1,3,5,2,
这就是洋葱
这里附上经典的图吧
复制代码
ます。https://juejin.im/post/5cf749fef265da1baa1e626dで再現