suchen
HeimWeb-Frontendjs-TutorialNode.js Asynchronous Programming Callback Einführung (1)_node.js

Node.js basiert auf der JavaScript-Engine v8 und ist Single-Threaded. Node.js verwendet asynchrone Programmiermethoden ähnlich wie JavaScript im Web, um blockierende E/A-Vorgänge zu verarbeiten. Das Lesen von Dateien, der Zugriff auf Datenbanken, Netzwerkanfragen usw. in Node.js können alle asynchron sein. Für Node.js-Neulinge oder Entwickler, die mit einem anderen Sprachhintergrund auf Node.js umsteigen, ist die asynchrone Programmierung ein schmerzhafter Teil. In diesem Kapitel werden Sie in alle Aspekte der asynchronen Programmierung mit Node.j eingeführt, von den einfachsten bis hin zu den tieferen. Vom einfachsten Rückruf über Thunk, Promise, Co bis hin zu Async/Await, das für ES7 geplant ist.

Beginnen wir zunächst mit einem konkreten Beispiel der asynchronen Programmierung.

Wetterinformationen für mehrere IP-Standorte abrufen

In der Datei ip.json gibt es ein Array, in dem wir mehrere IP-Adressen speichern, die von verschiedenen Besuchern stammen. Der Inhalt ist wie folgt:

Code kopieren Der Code lautet wie folgt:

// ip.json
["115.29.230.208", "180.153.132.38", "74.125.235.224", "91.239.201.98", "60.28.215.115"]

Ich hoffe, dass ich für jeden IP-Standort das aktuelle Wetter abrufen kann. Geben Sie die Ergebnisse in der Datei „wetter.json“ im folgenden Format aus:
Code kopieren Der Code lautet wie folgt:

// Weather.json
[
{ "ip": "115.29.230.208", "weather": "Clouds", "region": "Zhejiang" },
{ "ip": "180.153.132.38", "weather": "Clear", "region": "Shanghai" },
{ "ip": "74.125.235.224", "weather": "Rain", "region": "California" },
{ "ip": "60.28.215.115", "weather": "Clear", "region": "Tianjin" }
]

Um unsere Gedanken zu ordnen, unterteilen wir es in die folgenden Schritte:

1. Lesen Sie die IP-Adresse
2. Ermitteln Sie den geografischen Standort der IP anhand der IP-Adresse 3. Überprüfen Sie das lokale Wetter anhand des geografischen Standorts 4. Schreiben Sie die Ergebnisse in die Datei Weather.json.

Diese Schritte sind alle asynchron (das Lesen und Schreiben von Dateien kann synchron sein, aber als Beispiel wird asynchron verwendet).

Rückruf

Zuerst versuchen wir, es so zu implementieren, wie es die Node.js-API normalerweise vorsieht – indem wir einen Rückruf als asynchronen Rückruf übergeben, ohne eine Bibliothek zu verwenden. Wir werden drei Grundmodule verwenden:

1.fs: Lesen Sie die IP-Liste aus der Datei ip.json; schreiben Sie das Ergebnis in die Datei

2.Anfrage: Wird zum Senden von HTTP-Anfragen, zum Abrufen von Geodaten basierend auf der IP-Adresse und zum anschließenden Abrufen von Wetterdaten über Geodaten verwendet 3.Abfragezeichenfolge: Wird zum Zusammenstellen der URL-Parameter zum Senden von Anforderungen verwendet.


Erstellen Sie eine neue callback.js-Datei und führen Sie diese Module ein:


Code kopieren Der Code lautet wie folgt: // callback.js
var fs = require('fs')
var request = require('request')
var qs = require('querystring')



Lesen Sie die IP-Liste in der Datei, rufen Sie fs.readFile auf, um den Dateiinhalt zu lesen, und verwenden Sie dann JSON.parse, um die JSON-Daten zu analysieren:


Funktion readIP(Pfad, Rückruf) {
fs.readFile(path, function(err, data) {
Wenn (irrt) {
       Rückruf(err)
} sonst {
Versuchen Sie es mit {
         data = JSON.parse(data)
         Callback(null, data)
} Catch (Fehler) {
        Rückruf (Fehler)
}
}
})
}
...



Der nächste Schritt besteht darin, IP zu verwenden, um Geo zu erhalten. Wir verwenden request, um einen offenen Geodienst anzufordern:


Funktion ip2geo(ip, callback) {
var url = 'http://www.telize.com/geoip/' ip
Anfrage({
URL: URL,
json: true
}, function(err, resp, body) {
​ callback(err, body)
})
}
...

Verwenden Sie Geodaten, um das Wetter zu erhalten:

Code kopieren Der Code lautet wie folgt:

...
Funktion geo2weather(lat, lon, callback) {
var params = {
lat: lat,
lon: lon,
APPID: '9bf4d2b07c7ddeb780c5b32e636c679d'
}
var url = 'http://api.openweathermap.org/data/2.5/weather?' qs.stringify(params)
Anfrage({
URL: URL,
json: wahr,
}, function(err, resp, body) {
​ callback(err, body)
})
}
...

Nachdem wir nun die Schnittstellen für Geo und Wetter erhalten haben, müssen wir uns noch mit einem etwas komplizierteren Problem befassen. Da es mehrere IPs gibt, müssen wir Geodaten parallel lesen und Wetterdaten parallel lesen:
Code kopieren Der Code lautet wie folgt:

...
Funktion ips2geos(ips, callback) {
var geos = []
var ip
var bleibt = ips.length
for (var i = 0; i ip = ips[i];
(Funktion(ip) {
ip2geo(ip, function(err, geo) {
Wenn (irrt) {
          Rückruf(err)
         } sonst {
          geo.ip = ip
           geos.push(geo)
             bleiben--
}
Wenn (bleib == 0) {
           Callback(null, geos)
}
})
})(ip)
}
}

Funktion geos2weathers(geos, callback) {
var Weathers = []
var geo
var bleibt = geos.length
for (var i = 0; i Geo = geos[i];
(Funktion(geo) {
geo2weather(geo.latitude, geo.longitude, function(err, Weather) {
Wenn (irrt) {
          Rückruf(err)
         } sonst {
Weather.geo = geo
Weather.push(Wetter)
             bleiben--
}
Wenn (bleib == 0) {
            Callback(null, Weathers)
}
})
})(geo)
}
}
...

Sowohl ips2geos als auch geos2weathers verwenden die relativ primitive Methode „Reit“, um die Anzahl der Elemente zu berechnen, die auf die Rückgabe warten. Wenn „Remain“ 0 ist, bedeutet dies, dass die parallele Anforderung beendet ist und die Verarbeitungsergebnisse in ein Array geladen und zurückgegeben werden .

Der letzte Schritt besteht darin, die Ergebnisse in die Datei Weather.json zu schreiben:

Code kopieren Der Code lautet wie folgt:

...
Funktion writeWeather(Wetter, Rückruf) {
var-Ausgabe = []
Var-Wetter
for (var i = 0; i Weather = Weathers[i]
Output.push({
IP: Weather.geo.ip,
Wetter: Weather.weather[0].main,
Region: Weather.geo.region
})
}
fs.writeFile('./weather.json', JSON.stringify(output, null, ' '), callback)
}
...

Durch die Kombination der oben genannten Funktionen können wir unser Ziel erreichen:

Code kopieren Der Code lautet wie folgt:

...
Funktion handlerError(err) {
  console.log('error: ' err)
}

readIP('./ip.json', function(err, ips) {
  if (irr) {
    handlerError(err)
  } sonst {
    ips2geos(ips, function(err, geos) {
      if (irr) {
        handlerError(err)
      } sonst {
        geos2weathers(geos, function(err, Weathers) {
          if (irr) {
            handlerError(err)
          } sonst {
            writeWeather(weathers, function(err) {
              if (irr) {
                handlerError(err)
              } sonst {
                console.log('success!')
              }
            })
          }
        })
      }
    })
  }
})

哈哈, 你妈这嵌套, 你可能觉得这就是 JavaScript 异步的问题, 说真的, 嵌套不是 JavaScript. 异步的真正问题所在。上面这段代码我们可以下面这样写:

复制代码 代码如下:

...
Funktion ReadIPCallback(err, ips) {
  if (irr) {
    handlerError(err)
  } sonst {
    ips2geos(ips, ips2geosCallback)
  }
}

Funktion ips2geosCallback(err, geos) {
  if (irr) {
    handlerError(err)
  } sonst {
    geos2weathers(geos, geos2weathersCallback)
  }
}

Funktion geos2weathersCallback(ähm, Wetter) {
  if (irr) {
    handlerError(err)
  } sonst {
    writeWeather(Wetter, writeWeatherCallback)
  }
}

Funktion writeWeatherCallback(err) {
  if (irr) {
    handlerError(err)
  } sonst {
    console.log('success!')
  }
}

readIP('./ip.json', ReadIPCallback)

好了,这是我们 callback.js 的全部内容。运行:

复制代码 代码如下:

Knoten callback.js

将会生成wetter.json 文件:
复制代码 代码如下:

[
  {
    „ip“: „180.153.132.38“,
    „Wetter“: „Klar“,
    „Region“: „Shanghai“
  },
  {
    „ip“: „91.239.201.98“,
    „Wetter“: „Wolken“
  },
  {
    „ip“: „60.28.215.115“,
    „Wetter“: „Klar“,
    „Region“: „Tianjin“
  },
  {
    „ip“: „74.125.235.224“,
    „Wetter“: „Wolken“,
    „Region“: „Kalifornien“
  },
  {
    „ip“: „115.29.230.208“,
    „Wetter“: „Klar“,
    „Region“: „Zhejiang“
  }
]

Was ist dann das eigentliche Problem?

Natürlich handelt es sich um ein asynchrones Problem, bei dem es im Wesentlichen um drei Dinge geht:

1. Wenn der asynchrone Vorgang endet, muss eine Rückrufbenachrichtigung erfolgen 2. Die asynchron generierten Ergebnisse müssen zurückgesendet werden. Der Rückruf akzeptiert einen Datenparameter und gibt die Daten zurück 3. Was soll ich tun, wenn ein asynchroner Fehler auftritt? Callback akzeptiert einen Fehlerparameter und gibt den Fehler zurück.

Aber haben Sie viele sich wiederholende Arbeiten (verschiedene Rückrufe) festgestellt? Stimmt etwas mit dem obigen Code nicht? Bitte freuen Sie sich auf die Fortsetzung dieses Artikels.

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

怎么使用pkg将Node.js项目打包为可执行文件?怎么使用pkg将Node.js项目打包为可执行文件?Jul 26, 2022 pm 07:33 PM

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

一文解析package.json和package-lock.json一文解析package.json和package-lock.jsonSep 01, 2022 pm 08:02 PM

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

分享一个Nodejs web框架:Fastify分享一个Nodejs web框架:FastifyAug 04, 2022 pm 09:23 PM

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

图文详解node.js如何构建web服务器图文详解node.js如何构建web服务器Aug 08, 2022 am 10:27 AM

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

Herunterladen der Mac-Version des Atom-Editors

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor