อย่างที่เราทราบกันดีว่าอะซิงโครนัสเป็นคุณลักษณะและข้อได้เปรียบที่เป็นเอกลักษณ์ แต่ในเวลาเดียวกันความจำเป็นในการซิงโครไนซ์ในโปรแกรม (ตัวอย่างเช่นลำดับการดำเนินการของโปรแกรมควบคุมคือ: func1 -> func2 -> func3) ก็เป็นเรื่องธรรมดามากเช่นกัน บทความนี้บันทึกความคิดของฉันเกี่ยวกับปัญหานี้
ฟังก์ชั่นที่จะดำเนินการ:
การคัดลอกรหัสมีดังนี้:
var func1 = function (req, res, callback) {
settimeout (function () {
console.log ('in func1');
การโทรกลับ (req, res, 1);
}, 13000);
-
var func2 = function (req, res, callback) {
settimeout (function () {
console.log ('in func2');
การโทรกลับ (req, res, 2);
}, 5000);
-
var func3 = function (req, res, callback) {
settimeout (function () {
console.log ('in func3');
การโทรกลับ (req, res, 3);
}, 1,000);
-
จะเห็นได้ว่าใน func1, func2 และ func3 เวลาดำเนินการคือ 13 วินาที, 5 วินาทีและ 1 วินาทีตามลำดับ เนื่องจากลักษณะแบบอะซิงโครนัสของ nodejs หากคุณใช้วิธีการเรียกใช้ฟังก์ชันทั่วไป:
การคัดลอกรหัสมีดังนี้:
var req = null;
var res = null;
var callback = function () {};
func1 (req, res, callback);
func2 (req, res, callback);
func3 (req, res, callback);
เนื้อหาเอาต์พุต:
การคัดลอกรหัสมีดังนี้:
ใน func3
ใน func2
ใน func1
เหตุผลก็คือ NodeJS เป็นแบบอะซิงโครนัส Func2 จะไม่รอให้ FunC1 ถูกดำเนินการก่อนที่จะดำเนินการ แต่จะดำเนินการทันที (และเป็น FunC3) เนื่องจาก Func3 มีเวลาทำงานที่สั้นที่สุดจึงสิ้นสุดลงก่อน Func2 ตามด้วย FunC1 ล่าสุด แต่นี่ไม่ใช่ผลลัพธ์ที่เราต้องการ จะทำอย่างไร?
วิธีแก้ปัญหา 1: การโทรกลับ
การคัดลอกรหัสมีดังนี้:
// การทำรังลึก
var req = null;
var res = null;
func1 (req, res, function () {
func2 (req, res, function () {
func3 (req, res, function () {
process.exit (0);
-
-
-
แม้ว่าวิธีนี้สามารถแก้ไขได้อย่างรวดเร็ว แต่ปัญหาที่เปิดเผยก็ชัดเจนเช่นกัน ก่อนอื่นการบำรุงรักษารหัสไม่ได้อยู่ในสถานที่และที่สองการทำรังลึกของรหัสดูไม่สบายใจ วิธีนี้ไม่แนะนำให้ใช้
โซลูชันที่ 2: การโทรแบบเรียกซ้ำ
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น executeFunc (funcs, count, sum, req, res) {
if (count == sum) {
กลับ ;
-
อื่น{
funcs [count] (req, req, function () {
นับ ++;
ExecuteFunc (funcs, count, sum, req, res);
-
-
-
// การโทรแบบซิงโครนัส
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = funcs.length;
ExecuteFunc (funcs, 0, len, req, res);
ก่อนอื่นฟังก์ชั่นหลายฟังก์ชั่นจะถูกสร้างขึ้นเป็นอาร์เรย์ จากนั้นคุณสามารถใช้คุณสมบัติของฟังก์ชั่นการเรียกซ้ำเพื่อให้โปรแกรมดำเนินการตามลำดับที่แน่นอน
โซลูชัน 3: โทรไปที่ไลบรารีคลาส
ด้วยการพัฒนาของ NodeJS มีห้องสมุดชั้นเรียนมากขึ้นเรื่อย ๆ ที่ตอบสนอง ขั้นตอนและ async เป็นสิ่งที่ดี
1. การโทรไปยังขั้นตอนนั้นค่อนข้างสดชื่น:
การคัดลอกรหัสมีดังนี้:
ขั้นตอน (
ฟังก์ชั่น thefunc1 () {
func1 (นี่);
-
ฟังก์ชั่น thefunc2 (finishflag) {
console.log (finishflag);
func2 (นี่);
-
ฟังก์ชั่น thefunc3 (finishflag) {
console.log (finishflag);
-
-
2. วิธีการซีรี่ส์ของ Async ในกรณีนี้วิธีการโทร:
การคัดลอกรหัสมีดังนี้:
var req = null;
var res = null;
var callback = function () {};
async.series (
-
ฟังก์ชั่น (โทรกลับ) {
func1 (req, res, callback);
-
ฟังก์ชั่น (โทรกลับ) {
func2 (req, res, callback);
-
ฟังก์ชั่น (โทรกลับ) {
func3 (req, res, callback);
-
-
-