Rumah hujung hadapan web tutorial js Node.js Asynchronous Programming Callback Pengenalan (1)_node.js

Node.js Asynchronous Programming Callback Pengenalan (1)_node.js

May 16, 2016 pm 04:07 PM
node.js Pengaturcaraan tak segerak

Node.js adalah berdasarkan enjin JavaScript v8 dan berbenang tunggal. Node.js menggunakan kaedah pengaturcaraan tak segerak yang serupa dengan JavaScript di Web untuk mengendalikan operasi I/O yang menyekat. Membaca fail, mengakses pangkalan data, permintaan rangkaian, dsb. dalam Node.js semuanya mungkin tidak segerak. Bagi mereka yang baru menggunakan Node.js atau pembangun yang berhijrah ke Node.js daripada latar belakang bahasa lain, pengaturcaraan tak segerak adalah bahagian yang menyakitkan. Bab ini akan memperkenalkan anda kepada semua aspek pengaturcaraan tak segerak Node.js daripada yang paling mudah kepada yang lebih mendalam. Daripada panggilan balik yang paling asas kepada thunk, Promise, co kepada async/menunggu yang dirancang untuk ES7.

Pertama, mari kita mulakan dengan contoh khusus pengaturcaraan tak segerak.

Dapatkan maklumat cuaca untuk berbilang lokasi IP

Dalam fail ip.json, terdapat tatasusunan di mana kami menyimpan beberapa alamat IP, yang merupakan pelawat yang berbeza dari tempat yang berbeza Kandungannya adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

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

Saya harap saya boleh mendapatkan cuaca semasa untuk setiap lokasi IP. Keluarkan keputusan ke fail weather.json dalam format berikut:
Salin kod Kod adalah seperti berikut:

// weather.json
[
{ "ip": "115.29.230.208", "cuaca": "Awan", "rantau": "Zhejiang" },
{ "ip": "180.153.132.38", "cuaca": "Jelas", "rantau": "Shanghai" },
{ "ip": "74.125.235.224", "cuaca": "Hujan", "rantau": "California" },
{ "ip": "60.28.215.115", "cuaca": "Jelas", "rantau": "Tianjin" }
]

Untuk menyusun pemikiran kami, kami membahagikannya kepada langkah-langkah berikut:

1. Baca alamat ip; 2. Dapatkan lokasi geografi IP berdasarkan alamat IP; 3. Semak cuaca tempatan berdasarkan lokasi geografi; 4. Tulis keputusan ke fail weather.json.

Langkah ini semuanya tak segerak (membaca dan menulis fail boleh segerak, tetapi sebagai contoh, tak segerak digunakan).

panggil balik

Pertama, kami cuba melaksanakannya mengikut cara yang biasanya disediakan oleh Node.js API - menghantar panggilan balik sebagai panggilan balik tak segerak tanpa menggunakan sebarang pustaka. Kami akan menggunakan tiga modul asas:

1.fs: Baca senarai IP daripada fail ip.json; 2.permintaan: digunakan untuk menghantar permintaan HTTP, mendapatkan data geo berdasarkan alamat IP, dan kemudian mendapatkan data cuaca melalui data geo; 3.querystring: digunakan untuk memasang parameter url untuk menghantar permintaan.

Buat fail callback.js baharu dan perkenalkan modul ini:



Salin kod

Kod adalah seperti berikut: // callback.js var fs = memerlukan('fs') var request = memerlukan('request')
var qs = memerlukan('querystring')



Baca senarai IP dalam fail, panggil fs.readFile untuk membaca kandungan fail, dan kemudian gunakan JSON.parse untuk menghuraikan data JSON:

Salin kod

Kod adalah seperti berikut: ... function readIP(path, callback) { fs.readFile(laluan, fungsi(err, data) {
Jika (err) {
       panggil balik(err)
} lain {
Cuba {
         data = JSON.parse(data)
         panggil balik(null, data)
} tangkap (ralat) {
        panggil balik(ralat)
}
}
})
}
...



Langkah seterusnya ialah menggunakan IP untuk mendapatkan geo Kami menggunakan permintaan untuk meminta perkhidmatan geo terbuka:

Salin kod

Kod adalah seperti berikut: ... fungsi ip2geo(ip, panggil balik) { var url = 'http://www.telize.com/geoip/' ip
permintaan ({
url: url,
json: benar
}, fungsi(err, resp, body) {
​ panggil balik(err, body)
})
}
...

Gunakan data geo untuk mendapatkan cuaca:

Salin kod Kod adalah seperti berikut:

...
fungsi geo2weather(lat, lon, panggil balik) {
var params = {
lat: lat,
lon: lon,
APPID: '9bf4d2b07c7ddeb780c5b32e636c679d'
}
var url = 'http://api.openweathermap.org/data/2.5/weather?' qs.stringify(params)
permintaan ({
url: url,
json: benar,
}, fungsi(err, resp, body) {
​ panggil balik(err, body)
})
}
...

Memandangkan kami telah memperoleh antara muka untuk geo dan cuaca, kami masih mempunyai masalah yang lebih rumit untuk ditangani Kerana terdapat berbilang IP, kami perlu membaca geo secara selari dan membaca data cuaca secara selari:
Salin kod Kod adalah seperti berikut:

...
fungsi ips2geos(ips, panggil balik) {
var geos = []
var ip
var kekal = ips.length
untuk (var i = 0; i < ips.length; i ) {
ip = ips[i];
(fungsi(ip) {
ip2geo(ip, fungsi(err, geo) {
Jika (err) {
          panggil balik(err)
         } lain {
          geo.ip = ip
           geos.push(geo)
             kekal--
}
Jika (kekal == 0) {
           panggil balik(null, geos)
}
})
})(ip)
}
}

fungsi geos2weathers(geos, panggil balik) {
var weathers = []
var geo
var kekal = geos.length
untuk (var i = 0; i < geos.length; i ) {
Geo = geos[i];
(fungsi(geo) {
geo2weather(geo.latitud, geo.longitud, fungsi(err, cuaca) {
Jika (err) {
          panggil balik(err)
         } lain {
weather.geo = geo
cuaca.tolak(cuaca)
             kekal--
}
Jika (kekal == 0) {
            panggil balik(null, weathers)
}
})
})(geo)
}
}
...

Kedua-dua ips2geos dan geos2weathers menggunakan kaedah yang agak primitif, kekal untuk mengira bilangan item yang menunggu untuk dipulangkan Jika kekal ialah 0, ini bermakna permintaan selari telah tamat dan hasil pemprosesan dimuatkan ke dalam tatasusunan dan dikembalikan. .

Langkah terakhir ialah menulis keputusan ke dalam fail weather.json:

Salin kod Kod adalah seperti berikut:

...
fungsi writeWeather(cuaca, panggil balik) {
var output = []
cuaca var
untuk (var i = 0; i < weathers.length; i ) {
cuaca = cuaca[i]
Output.push({
IP: weather.geo.ip,
Cuaca: weather.weather[0].utama,
Rantau: weather.geo.region
})
}
fs.writeFile('./weather.json', JSON.stringify(output, null, ' '), panggil balik)
}
...

Dengan menggabungkan fungsi di atas, kami boleh mencapai matlamat kami:

Salin kod Kod adalah seperti berikut:

...
fungsi pengendaliRalat(err) {
  console.log('error: ' err)
}

readIP('./ip.json', function(err, ips) {
  jika (err) {
    handlerError(err)
  } lain {
    ips2geos(ips, fungsi(err, geos) {
      jika (err) {
        handlerError(err)
      } lain {
        geos2weathers(geos, fungsi(err, cuaca) {
          jika (err) {
            handlerError(err)
          } lain {
            writeWeather(cuaca, fungsi(err) {
              jika (err) {
                handlerError(err)
              } lain {
                console.log('berjaya!')
              }
            })
          }
        })
      }
    })
  }
})

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

复制代码 代码如下:

...
fungsi ReadIPCallback(err, ips) {
  jika (err) {
    handlerError(err)
  } lain {
    ips2geos(ips, ips2geosCallback)
  }
}

fungsi ips2geosCallback(err, geos) {
  jika (err) {
    handlerError(err)
  } lain {
    geos2weathers(geos, geos2weathersCallback)
  }
}

fungsi geos2weathersCallback(err, weathers) {
  jika (err) {
    handlerError(err)
  } lain {
    writeWeather(cuaca, tulisWeatherCallback)
  }
}

fungsi writeWeatherCallback(err) {
  jika (err) {
    handlerError(err)
  } lain {
    console.log('berjaya!')
  }
}

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

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

复制代码 代码如下:

nod panggil balik.js

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

[
  {
    "ip": "180.153.132.38",
    "cuaca": "Jelas",
    "rantau": "Shanghai"
  },
  {
    "ip": "91.239.201.98",
    "cuaca": "Awan"
  },
  {
    "ip": "60.28.215.115",
    "cuaca": "Jelas",
    "rantau": "Tianjin"
  },
  {
    "ip": "74.125.235.224",
    "cuaca": "Awan",
    "rantau": "California"
  },
  {
    "ip": "115.29.230.208",
    "cuaca": "Jelas",
    "wilayah": "Zhejiang"
  }
]

Lalu apa masalah sebenarnya?

Sudah tentu ia adalah masalah asynchronous pada asasnya perlu berurusan dengan tiga perkara:

1. Apabila operasi asynchronous tamat, ia perlu dimaklumkan semula ialah penyelesaian
2. Hasil yang dijana secara tidak segerak perlu dihantar kembali menerima parameter data dan menghantar kembali data; 3. Apakah yang perlu saya lakukan jika ralat tak segerak berlaku? Panggilan balik menerima parameter ralat dan mengembalikan ralat.

Tetapi adakah anda telah menemui banyak kerja berulang (pelbagai panggilan balik)? Adakah terdapat apa-apa yang salah dengan kod di atas? Sila nantikan sambungan artikel ini.

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan pengaturcaraan tak segerak dengan fungsi C++? Bagaimana untuk melaksanakan pengaturcaraan tak segerak dengan fungsi C++? Apr 27, 2024 pm 09:09 PM

Ringkasan: Pengaturcaraan tak segerak dalam C++ membenarkan berbilang tugas tanpa menunggu operasi yang memakan masa. Gunakan penunjuk fungsi untuk mencipta penunjuk kepada fungsi. Fungsi panggil balik dipanggil apabila operasi tak segerak selesai. Perpustakaan seperti boost::asio menyediakan sokongan pengaturcaraan tak segerak. Kes praktikal menunjukkan cara menggunakan penunjuk fungsi dan boost::asio untuk melaksanakan permintaan rangkaian tak segerak.

Pengaturcaraan Asynchronous Fungsi JavaScript: Petua Penting untuk Mengendalikan Tugas Kompleks Pengaturcaraan Asynchronous Fungsi JavaScript: Petua Penting untuk Mengendalikan Tugas Kompleks Nov 18, 2023 am 10:06 AM

Fungsi JavaScript Pengaturcaraan Asynchronous: Kemahiran Penting untuk Mengendalikan Tugasan Kompleks Pengenalan: Dalam pembangunan front-end moden, pengendalian tugas yang kompleks telah menjadi bahagian yang amat diperlukan. Kemahiran pengaturcaraan tak segerak fungsi JavaScript adalah kunci untuk menyelesaikan tugas yang kompleks ini. Artikel ini akan memperkenalkan konsep asas dan kaedah praktikal biasa bagi pengaturcaraan tak segerak fungsi JavaScript, dan menyediakan contoh kod khusus untuk membantu pembaca memahami dan menggunakan teknik ini dengan lebih baik. 1. Konsep asas pengaturcaraan tak segerak Dalam pengaturcaraan segerak tradisional, kodnya ialah

Cara menggunakan ReactPHP untuk pengaturcaraan tak segerak dalam PHP Cara menggunakan ReactPHP untuk pengaturcaraan tak segerak dalam PHP Jun 27, 2023 am 09:14 AM

Apabila aplikasi web menjadi lebih kompleks, pengaturcara terpaksa menggunakan pengaturcaraan tak segerak untuk mengendalikan sejumlah besar permintaan dan operasi I/O. PHP: HypertextPreprocessor tidak terkecuali. Untuk memenuhi keperluan ini, ReactPHP telah menjadi salah satu rangka kerja pengaturcaraan tak segerak yang paling popular untuk PHP. Dalam artikel ini, kita akan membincangkan cara melakukan pengaturcaraan tak segerak dalam PHP menggunakan ReactPHP. 1. Pengenalan kepada ReactPHP ReactPHP ialah pengaturcaraan berasaskan peristiwa

Bagaimana untuk melaksanakan pengendalian mesej tak segerak dalam PHP Bagaimana untuk melaksanakan pengendalian mesej tak segerak dalam PHP Jul 10, 2023 am 08:19 AM

Cara melaksanakan pemprosesan mesej tak segerak dalam PHP Pengenalan: Dalam aplikasi web moden, pemprosesan mesej tak segerak menjadi semakin penting. Pemprosesan mesej tak segerak boleh meningkatkan prestasi dan kebolehskalaan sistem dan meningkatkan pengalaman pengguna. Sebagai bahasa pengaturcaraan sisi pelayan yang biasa digunakan, PHP juga boleh melaksanakan pemprosesan mesej tak segerak melalui beberapa teknologi. Dalam artikel ini, kami akan memperkenalkan beberapa kaedah untuk melaksanakan pemprosesan mesej tak segerak dalam PHP dan memberikan contoh kod. Menggunakan Baris Giliran Mesej Baris Gilir Mesej ialah cara menyahganding komponen sistem, membenarkan komponen berbeza

Pemahaman mendalam tentang ciri baharu PHP8: Bagaimana untuk menggunakan pengaturcaraan dan kod tak segerak dengan cekap? Pemahaman mendalam tentang ciri baharu PHP8: Bagaimana untuk menggunakan pengaturcaraan dan kod tak segerak dengan cekap? Sep 11, 2023 pm 01:52 PM

Pemahaman mendalam tentang ciri baharu PHP8: Bagaimana untuk menggunakan pengaturcaraan dan kod tak segerak dengan cekap? PHP8 ialah versi utama terkini bahasa pengaturcaraan PHP, membawakan banyak ciri baharu dan penambahbaikan yang menarik. Salah satu ciri yang paling menonjol ialah sokongan untuk pengaturcaraan tak segerak. Pengaturcaraan tak segerak membolehkan kami meningkatkan prestasi dan responsif apabila menangani tugas serentak. Artikel ini akan melihat secara mendalam ciri pengaturcaraan tak segerak PHP8 dan menerangkan cara menggunakannya dengan cekap. Pertama, mari kita fahami apa itu pengaturcaraan tak segerak. Dalam model pengaturcaraan segerak tradisional, kod mengikut urutan linear

Masalah dan penyelesaian biasa dalam pengaturcaraan tak segerak dalam rangka kerja Java Masalah dan penyelesaian biasa dalam pengaturcaraan tak segerak dalam rangka kerja Java Jun 04, 2024 pm 05:09 PM

3 masalah dan penyelesaian biasa dalam pengaturcaraan tak segerak dalam rangka kerja Java: Callback Hell: Gunakan Promise atau CompletableFuture untuk mengurus panggilan balik dalam gaya yang lebih intuitif. Perbalahan sumber: Gunakan primitif penyegerakan (seperti kunci) untuk melindungi sumber yang dikongsi dan pertimbangkan untuk menggunakan koleksi selamat benang (seperti ConcurrentHashMap). Pengecualian tidak terkendali: Mengendalikan pengecualian dalam tugas secara eksplisit dan menggunakan rangka kerja pengendalian pengecualian (seperti CompletableFuture.exceptionally()) untuk mengendalikan pengecualian.

Bagaimanakah rangka kerja golang mengendalikan konkurensi dan pengaturcaraan tak segerak? Bagaimanakah rangka kerja golang mengendalikan konkurensi dan pengaturcaraan tak segerak? Jun 02, 2024 pm 07:49 PM

Rangka kerja Go menggunakan ciri serentak dan tak segerak Go untuk menyediakan mekanisme untuk mengendalikan tugas serentak dan tak segerak dengan cekap: 1. Keselarasan dicapai melalui Goroutine, membolehkan berbilang tugasan dilaksanakan pada masa yang sama 2. Pengaturcaraan tak segerak dilaksanakan melalui saluran, yang boleh dilaksanakan tanpa menyekat utas utama Tugas 3. Sesuai untuk senario praktikal, seperti pemprosesan serentak permintaan HTTP, pemerolehan tak segerak data pangkalan data, dsb.

Pengaturcaraan asynchronous Python: Satu cara untuk mencapai concurrency yang cekap dalam kod asynchronous Pengaturcaraan asynchronous Python: Satu cara untuk mencapai concurrency yang cekap dalam kod asynchronous Feb 26, 2024 am 10:00 AM

1. Mengapa menggunakan pengaturcaraan tak segerak? Pengaturcaraan tradisional menggunakan penyekatan I/O, yang bermaksud program menunggu operasi selesai sebelum meneruskan. Ini mungkin berfungsi dengan baik untuk satu tugasan, tetapi mungkin menyebabkan program menjadi perlahan apabila memproses sejumlah besar tugas. Pengaturcaraan tak segerak mematahkan batasan I/O penyekat tradisional dan menggunakan I/O bukan penyekat, yang bermaksud program itu boleh mengagihkan tugas kepada utas atau gelung peristiwa yang berbeza untuk dilaksanakan tanpa menunggu tugasan selesai. Ini membolehkan program mengendalikan berbilang tugas secara serentak, meningkatkan prestasi dan kecekapan program. 2. Asas pengaturcaraan tak segerak Python Asas pengaturcaraan tak segerak Python ialah coroutine dan gelung peristiwa. Coroutine ialah fungsi yang membenarkan fungsi bertukar antara menggantung dan menyambung semula. Gelung acara bertanggungjawab untuk penjadualan

See all articles