Dieser Artikel stellt hauptsächlich die Geschichte der asynchronen Entwicklung von Express vor. Der Herausgeber findet ihn ziemlich gut. Jetzt werde ich ihn mit Ihnen teilen und als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf Betrieb von JavaScript, sodass Async in JavaScript blockieren kann) ist überall.
Express ist ein sehr beliebtes Webserver-Framework in der Node-Umgebung. Ein großer Teil der Node-Webanwendungen verwendet Express. Wenn wir JavaScript zum Schreiben von serverseitigem Code verwenden, werden wir zwangsläufig häufig Asynchronität verwenden. Mit der Weiterentwicklung von JavaScript und Node werden sich auch unsere asynchronen Verarbeitungsmethoden weiterentwickeln. Als nächstes werfen wir einen Blick auf die Entwicklung der asynchronen Verarbeitung in Express.
2. Asynchrone Verarbeitung von JavaScript
In der asynchronen Welt müssen wir einen Weg finden, die Benachrichtigung über den Abschluss zu erhalten asynchrone Methode, was sind dann die Methoden in JavaScript?
2.1. Rückruf Rückruf ist der originellste und älteste asynchrone Benachrichtigungsmechanismus in JS.
2.2. Ereignisüberwachung
Funktion, um das Ergebnis zu erhalten, eine bestimmte Zeit lang abhören. Nachdem die asynchrone Methode abgeschlossen ist, wird das Ereignis ausgelöst, um den Benachrichtigungseffekt zu erzielen.
function asyncFn(callback) { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); callback(); // 发通知 }, 2000); } asyncFn(function () { console.log('我会在2s后输出'); });
Verwenden Sie den Beobachtermodus, um den Herausgeber zu ändern, wenn der asynchrone Abschluss erfolgt. Zu diesem Zeitpunkt wird der Herausgeber die Abonnenten über die Änderungen informieren.
2.4, PromisePromise ist eine Verbesserung der Callback-Funktion. Auf diese Weise können wir die Asynchronität parallelisieren und die Callback-Hölle vermeiden.
2.5. Generator
Die Generatorfunktion ist eine von ES6 bereitgestellte asynchrone Programmierlösung.
function asyncFn() { return new Promise((resolve, reject) => { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); resolve(); // 发通知(是否有感觉到回调的影子?) }, 2000); }); } asyncFn() .then(function () { console.log('我会在2s后输出'); });
2.6, async...await
kann als die beste Lösung für den Umgang mit asynchronem Strom angesehen werden JavaScript.
function asyncFn() { return new Promise((resolve, reject) => { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); resolve(); // 发通知(是否有感觉到回调的影子?) }, 2000); }); } function* generatorSync() { var result = yield asyncFn(); } var g = generatorSync(); g.next().value.then(()=>{ console.log('我会在2s后输出'); });
3. Asynchrone Verarbeitung in Express
function asyncFn() { return new Promise((resolve, reject) => { // 利用setTimeout模拟异步 setTimeout(function () { console.log('执行完毕'); resolve(); // 发通知(是否有感觉到回调的影子?) }, 2000); }); } async function run(){ await asyncFn(); console.log('我会在2s后输出'); } run();
Um eine Demonstrationsumgebung zu erstellen, initialisieren Sie ein Express-Projekt über den Express-Generator. Im Allgemeinen verwenden serverseitige Projekte Routen zum Aufrufen der Geschäftslogik. Deshalb folgen wir auch diesem Prinzip: Öffnen Sie routers/index.js und wir werden den folgenden Inhalt sehen. Die folgende Demo wird diese Datei zur Demonstration verwenden.
3.1. Die Callback-Funktion verarbeitet die asynchrone Express-Logik.In Express kann das Routing mehrere Middleware laden Schreiben Sie die Geschäftslogik gemäß der Middleware-Schreibmethode. Auf diese Weise kann die asynchrone Logik sehr bequem über die nächsten Schichten aufgeteilt werden.
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;
3.2. Promise-Verarbeitung Express-asynchrone Logik
In dieser Lösung werden mehrere Geschäftslogiken als Rückgabe-Promise-Funktionen gepackt . Führen Sie kombinierte Anrufe über Geschäftsmethoden durch, um den Effekt von „One In“ und „One Out“ zu erzielen.
var express = require('express'); var router = express.Router(); function asyncFn(req, res, next) { setTimeout(() => { req.user = {}; // 设置当前请求的用户 next(); }, 2000); } function asyncFn2(req, res, next) { setTimeout(() => { req.auth = {}; // 设置用户权限 next(); }, 2000); } function asyncFn3(req, res, next) { setTimeout(() => { res.locals = { title: 'Express Async Test' }; // 设置数据 res.render('index'); // 响应 }, 2000); } /* GET home page. */ router.get('/', asyncFn, asyncFn2, asyncFn3); // 一步步执行中间件 module.exports = router;
3.3. async...await handles Express asynchrone Logik
Tatsächlich erfordert diese Lösung auch Promise It wird unterstützt, aber die Schreibmethode ist intuitiver und die Fehlerbehandlung ist direkter.
var express = require('express'); var router = express.Router(); function asyncFn(req, res) { return new Promise((resolve, reject) => { setTimeout(() => { req.user = {}; // 设置当前请求的用户 resolve(req); }, 2000); }); } function asyncFn2(req) { return new Promise((resolve, reject) => { setTimeout(() => { req.auth = {}; // 设置用户权限 resolve(); }, 2000); }); } function asyncFn3(res) { return new Promise((resolve, reject) => { setTimeout(() => { res.locals = { title: 'Express Async Test' }; // 设置数据 res.render('index'); // 响应 }, 2000); }); } function doBizAsync(req, res, next) { asyncFn(req) .then(() => asyncFn2(req)) .then(() => asyncFn3(res)) .catch(next); // 统一异常处理 }; /* GET home page. */ router.get('/', doBizAsync); module.exports = router;
4. Zusammenfassung
var express = require('express'); var router = express.Router(); function asyncFn(req) { return new Promise((resolve, reject) => { setTimeout(() => { req.user = {}; // 设置当前请求的用户 resolve(req); }, 2000); }); } function asyncFn2(req) { return new Promise((resolve, reject) => { setTimeout(() => { req.auth = {}; // 设置用户权限 resolve(); }, 2000); }); } function asyncFn3(res) { return new Promise((resolve, reject) => { setTimeout(() => { }, 2000); }); } async function doBizAsync(req, res, next) { var result = await asyncFn(req); var result2 = await asyncFn2(req); res.locals = { title: 'Express Async Test' }; // 设置数据 res.render('index'); // 响应 }; const tools = { asyncWrap(fn) { return (req, res, next) => { fn(req, res, next).catch(next); // async...await在Express中的错误处理 } } }; /* GET home page. */ router.get('/', tools.asyncWrap(doBizAsync)); // 需要用工具方法包裹一下 module.exports = router;
Einige der oben genannten Lösungen werden bereits in Koa verwendet und sind in Kombination mit dem riesigen Ökosystem von Express noch leistungsfähiger. Github-Adresse dieses Artikels
Das obige ist der detaillierte Inhalt vonExpress-Entwicklungsgeschichte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!