Jadual Kandungan
异步编程案例一
回调函数格式规范
为什么第一个参数是 error
异步流程控制的问题
回调地狱
a
解决异步流程的控制问题
Rumah hujung hadapan web tutorial js 深入浅析Node.js异步编程中的callback(回调)

深入浅析Node.js异步编程中的callback(回调)

Jul 06, 2021 am 11:30 AM
node.js panggil balik Pengaturcaraan tak segerak

非阻塞 I/O 的运行结果是需要回调函数来接收的,下面本篇文章给大家详细介绍一下Node.js异步编程中的callback(回调)。

深入浅析Node.js异步编程中的callback(回调)

【推荐学习:《nodejs 教程》】

非阻塞 I/O 的运行结果是需要回调函数来接收的,这种通过回调函数的方式就是异步编程!

异步编程案例一

function interview(callback) {
  setTimeout(() => {
    callback("success");
  }, 1000);
}

interview(function (res) {
  if (res === "success") {
    console.log("============我笑了");
  }
});
Salin selepas log masuk

回调函数格式规范

  • error-first callbak
  • Node-style callback
  • 第一个参数是 error,后面的参数才是结果

为什么第一个参数是 error

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.3) {
      callback("success");
    }
    throw new Error("fail");
  }, 1000);
}

try {
  interview(function (res) {
    if (res === "success") {
      console.log("============我笑了");
    }
  });
} catch (error) {
  console.log("fail", error);
}
Salin selepas log masuk

1.png

上面的代码中,try catch并不能捕获 throw new Error(&#39;fail&#39;) 抛出的错误!,而是抛出到了 JS 全局! 在 Node.js 中,全局错误时非常严重的事情,会造成程序的崩溃!

为什么没 try catch 无法捕获 setTimeout 里面的 throw 呢? 这就跟调用栈事件循环有关系了!

每一个事件循环都是一个全新的调用栈! setTimeout 与 interview 是两个不同的事件循环!

但是可以通过在回调函数中的参数抛出错误的方式来解决这个问题

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.3) {
      callback(null, "success");
    } else {
      callback(new Error("fail"));
    }
  }, 1000);
}

interview(function (error) {
  if (error) {
    return console.log("============我哭了");
  }
  console.log("============我笑了");
});
Salin selepas log masuk

上面的代码中,可以根据参数的类型来判断是否出错! 但是 Node.js 中有很对回调函数, 我们不可能在每一个函数中都去判断参数类型是是否出错!

Node.js 规定第一个参数就是 erro,第二个参数就是结果!如果第一个参数不为空,则说明异步调用出错了!

异步流程控制的问题

回调地狱

多个异步任务串行的情况, 下面我们模拟一下 N 轮面试,

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.6) {
      callback(null, "success");
    } else {
      callback(new Error("fail"));
    }
  }, 1000);
}

interview(function (error) {
  if (error) {
    return console.log("======第一轮面试======我哭了");
  }

  interview(function (error) {
    if (error) {
      return console.log("====第二轮面试========我哭了");
    }

    interview(function (error) {
      if (error) {
        return console.log("====第三轮面试========我哭了");
      }

      console.log("三轮面试都成功了!啊哈哈哈!");
    });
  });
});
Salin selepas log masuk

可以看到上面的异步流程做了三层嵌套,这还只是代码就比较简单的情况! 那么在实际应用中,每一个嵌套函数都可能非常复杂,这就造成难以开发和维护,看着让人生气,这就是所谓的** 回调地狱**

a

多个个异步任务并发的情况

function interviewCompay() {
  let count = 0;
  interview(function (error) {
    if (error) {
      return console.log("====第一家公司面试========我哭了");
    }
    count++;
  });
  interview(function (error) {
    if (error) {
      return console.log("====第二家公司面试========我哭了");
    }
    count++;
    if (count === 2) {
      return console.log("两家公司面试都成功了!我笑了");
    }
  });
}
interviewCompay();
Salin selepas log masuk

在每一个异步任务里面都需要加入同一个变量才能捕获 多个异步任务的结果

解决异步流程的控制问题

  • promise
  • async await

更多编程相关知识,请访问:编程视频!!

Atas ialah kandungan terperinci 深入浅析Node.js异步编程中的callback(回调). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

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

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.

Robot ETF (562500) mungkin membuka peluang susun atur yang baik kerana ia telah ditarik balik selama 3 hari berturut-turut! Robot ETF (562500) mungkin membuka peluang susun atur yang baik kerana ia telah ditarik balik selama 3 hari berturut-turut! Dec 01, 2023 pm 04:01 PM

Pada awal dagangan pada 1 Disember 2023, tiga indeks saham utama dibuka lebih rendah. Robot ETF (562500) mula berdagang mengiring selepas jatuh pada awal sesi. Sehingga 10:20, Robot ETF (562500) jatuh 0.92%, dengan lebih daripada 60 daripada 82 pegangan jatuh. Teknologi Daheng dan Teknologi Shitou jatuh lebih daripada 5%, dan Teknologi Sukron, Perisikan Keda, Teknologi Xianhui dan Teknologi Hongxun jatuh lebih daripada 3%. Pada awal dagangan hari ini, Robot ETF (562500) telah membetulkan selama tiga hari berturut-turut. Mengimbas kembali keadaan pada bulan lalu, Robot ETF (562500) hanya mempunyai satu pembetulan selama tiga hari berturut-turut, dan kemudian membawa kepada lapan arah aliran positif berturut-turut. Penarikan balik ini mungkin merupakan peluang susun atur yang baik berikutan pengumuman oleh jabatan berkaitan pada awal November.

Apakah kelebihan dan kekurangan pengaturcaraan tak segerak dalam PHP? Apakah kelebihan dan kekurangan pengaturcaraan tak segerak dalam PHP? May 06, 2024 pm 10:00 PM

Kelebihan pengaturcaraan tak segerak dalam PHP termasuk daya pemprosesan yang lebih tinggi, kependaman yang lebih rendah, penggunaan sumber yang lebih baik dan kebolehskalaan. Kelemahan termasuk kerumitan, kesukaran dalam penyahpepijatan dan sokongan perpustakaan terhad. Dalam kes sebenar, ReactPHP digunakan untuk mengendalikan sambungan WebSocket, menunjukkan aplikasi praktikal pengaturcaraan tak segerak.

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