Koa2 での async&await の使用法は何ですか?
この記事では主に、Koa2 での async&await の使用法についての理解を紹介し、参考にさせていただきます。
Koa は非常に有名な Node サーバー側フレームワークであり、1.x バージョンと 2.x バージョンで利用できます。前者は非同期操作にジェネレーターを使用し、後者は最新の async/await ソリューションを使用します
この記述方法を初めて使用し始めたとき、問題が発生しました。コードは次のとおりです:
const Koa = require('koa'); const app = new Koa(); const doSomething = time => { return new Promise(resolve => { setTimeout(() => { resolve('task done!') }, time) }) } // 用来打印请求信息 app.use((ctx, next) => { console.log(`${ctx.method}:::${ctx.url}`) next() }) app.use(async ctx => { const result = await doSomething(3000) console.log(result); ctx.body = result }) app.listen(3000);
テストしてみましょう:curl http ://localhost:3000
期待される結果:
(3 秒後...)タスク完了!
しかし、現実は:
(すぐに)
見つかりません
一体何?期待どおりのパフォーマンスが得られないのはなぜですか?これには、Koa のミドルウェアがどのように直列に接続されているかを理解する必要があります。ソース コードを見ると、ミドルウェアを連結するコードは次のとおりです。
function compose (middleware) { return function (context, next) { // 这个index用来计数,防止next被多次调用 let index = -1 // 执行入口 return dispatch(0) function dispatch (i) { // 如果next被多次调用,报异常 if (i <= index) return Promise.reject(new Error('next() called multiple times')) index = i // 取出第一个middleware let fn = middleware[i] // 将最初传入的next作为最后一个函数执行 if (i === middleware.length) fn = next if (!fn) return Promise.resolve() try { /** 这里就是关键了,Promise.resolve是什么意思呢? Promise.resolve方法有下面三种形式: Promise.resolve(value); Promise.resolve(promise); Promise.resolve(theanable); 这三种形式都会产生一个新的Promise。其中: 第一种形式提供了自定义Promise的值的能力,它与Promise.reject(reason)对应。两者的不同,在于得到的Promise的状态不同。 第二种形式,提供了创建一个Promise的副本的能力。 第三种形式,是将一个类似Promise的对象转换成一个真正的Promise对象。它的一个重要作用是将一个其他实现的Promise对象封装成一个当前实现的Promise对象。例如你正在用bluebird,但是现在有一个Q的Promise,那么你可以通过此方法把Q的Promise变成一个bluebird的Promise。第二种形式可以归在第三种里面 **/ return Promise.resolve(fn(context, function next () { // 执行下一个middleware,返回结果也是一个Promise return dispatch(i + 1) })) } catch (err) { return Promise.reject(err) } } } }
上記の基礎を踏まえて、なぜ 2 番目のミドルウェアの実行を待たずに応答がすぐに返されるのかを見てみましょう。
最初のミドルウェアは非同期関数ではないためです。
次のメソッドを実行するたびに実際には Promise オブジェクトが返されるため、ミドルウェアで非同期操作を実行し、その完了を待ちたい場合は、ミドルウェアを実行する前に await を追加する必要があります
次に、前のコードを書き直してみましょう
app.use(async (ctx, next) => { console.log(`${ctx.method}:::${ctx.url}`) await next() }) app.use(async ctx => { const result = await doSomething(3000) console.log(result); ctx.body = result })
わかりました、問題はありません。すべてが期待どおりに実行されます:clap:
エラー処理
Promise と async/await 構文の強力な機能を利用して、try を使用するだけで済みます。 /catch 操作は、後続のすべてのミドルウェア例外をキャプチャできるように、最も外側のミドルウェアに記述されています。
app.use(async (ctx, next) => { try{ await next() }catch(err){ console.log(err) } }) app.use(async (ctx)=>{ throw new Error('something wrong!') ctx.body = 'Hello' })
ミドルウェアチェーンに基づいたフルコントロール、そしてPromiseに基づいているという事実により、すべてが簡単に操作できます。 if (err) return next(err) はもうどこにもありませんが、promise だけです
上記は私が皆さんのためにまとめたものです。将来皆さんのお役に立てれば幸いです。
関連記事:
Vue.js 2.0でWebApp環境を構築する方法とコルドバ開発
以上がKoa2 での async&await の使用法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











非同期はes7です。 async と await は ES7 に新しく追加されたもので、非同期操作のソリューションです。async/await は co モジュールとジェネレーター関数の糖衣構文と言え、より明確なセマンティクスで JS 非同期コードを解決します。名前が示すように、async は「非同期」を意味します。async は関数が非同期であることを宣言するために使用されます。async と await の間には厳密な規則があります。両方を互いに分離することはできず、await は async 関数内でのみ記述できます。

vue3 プロジェクトの構築 プロジェクトを作成する前に、最初に説明する必要があるのは、使用するバージョンが Nodejs: v17.5.0pnpm: 7.0.0Vue: 3.2.25 であることです。まず、Vite で FormValidate という名前の vue3 プロジェクト デモを作成します。コマンド ラインに pnpmcreateviteFormValidate コマンドを入力して Enter キーを押し、vue を選択して Enter キーを押し続けます。これは、最初に FormValidate (フォーム検証) プロジェクトを作成したことを示します。コマンド ライン プロンプトに従って、プロジェクトのルート ディレクトリを入力し、次に、コマンド pnpminstall を使用して、プロジェクトに必要な依存関係をインストールします。もちろん、ここで pnpm を使用する方が n よりも優れています。

async/await を使用して Vue で非同期操作を処理する方法 フロントエンド開発の継続的な開発に伴い、Vue でより複雑な非同期操作を処理する必要があります。 Vue は非同期操作を処理するための便利な方法をすでに多数提供していますが、場合によっては、これらの非同期操作を処理するために、よりシンプルで直感的な方法を使用する必要がある場合があります。現時点では、async/await は非常に良い選択になります。非同期/待機とは何ですか? ES2017 では、非同期と

コルーチン: コルーチンはマイクロスレッドとしても知られ、ユーザー モードのコンテキスト スイッチング テクノロジです。つまり、実際には実行間を切り替えるコード ブロックを実装するスレッドであり、Python のコルーチンのサポートはジェネレーターを通じて実装されます。ジェネレーターでは、for ループを反復処理するだけでなく、next() 関数を継続的に呼び出して、yield ステートメントによって返される次の値を取得することもできます。ただし、Python の yield は値を返すだけでなく、呼び出し元から送信されたパラメーターを受け取ることもできます。 1. ジェネレーターとは何ですか? Python では、ループと計算を同時に行うこのメカニズムをジェネレーターと呼びます: 遺伝子

1. 従来の同期構文リクエストの例は同じです。非同期構文の実装を理解する前に、同期構文の例から始めましょう。次に、HTTP リクエストがあると仮定します。このプログラムは、このリクエストを通じて対応する応答コンテンツを取得し、出力します。 import sock def request(host: str) -> None: """リクエストをシミュレートし、応答本文を出力します""" url: str = f"http://{host }" 靴下

新しいバージョンの V8 エンジンでは、Node.js は 7.6 以降の非同期関数機能をサポートします。今年 10 月 31 日には、Node.js 8 も新しい長期サポート バージョンになったので、コード内で非同期関数を安心して使用できるようになりました。この記事では、非同期関数とは何か、また非同期関数によって Node.js アプリケーションの作成方法がどのように変わるかを簡単に紹介します。

この記事では、JavaScript ループに関する関連知識を紹介します。主に、js ループでの await の使い方と結果の分析について説明します。興味のある方はぜひご覧ください。皆さんのお役に立てれば幸いです。

クエリ結果をオブジェクトまたは配列に変換します。実際の開発では、一部のクエリ結果は実際にオブジェクト JSON_OBJECT に入れる必要があります: () はキーと値の SELECT の形式です products.idasid、products.titleastitle、products.priceasprice、products .scoreasscore ,JSON_OBJECT('id',brand.id,'name',brand.name,'rank&#
