كما نعلم جميعًا ، فإن عدم التزامن هو ميزة وميزة فريدة ، ولكن في نفس الوقت ، فإن الحاجة إلى التزامن في البرامج (على سبيل المثال ، ترتيب تنفيذ برنامج التحكم هو: Func1 -> func2 -> func3) أمر شائع جدًا أيضًا. يسجل هذا المقال بعض أفكاري حول هذه القضية.
وظائف يتم تنفيذها:
نسخة الكود كما يلي:
var func1 = function (req ، res ، callback) {
setTimeout (function () {
console.log ('in func1') ؛
رد الاتصال (REQ ، الدقة ، 1) ؛
} ، 13000) ؛
}
var func2 = function (req ، res ، callback) {
setTimeout (function () {
console.log ('in func2') ؛
رد الاتصال (REQ ، الدقة ، 2) ؛
} ، 5000) ؛
}
var func3 = function (req ، res ، callback) {
setTimeout (function () {
console.log ('in func3') ؛
رد الاتصال (REQ ، الدقة ، 3) ؛
} ، 1000) ؛
}
يمكن ملاحظة أنه في FUNC1 و FUNC2 و FUNC3 ، يبلغ وقت التنفيذ 13 ثانية و 5 ثوانٍ وثانية على التوالي. نظرًا للطبيعة غير المتزامنة لـ NodeJs ، إذا كنت تستخدم طرق استدعاء الوظائف العادية:
نسخة الكود كما يلي:
var req = null ؛
var res = null ؛
var callback = function () {} ؛
FUNC1 (REQ ، الدقة ، رد الاتصال) ؛
FUNC2 (REQ ، الدقة ، رد الاتصال) ؛
FUNC3 (REQ ، الدقة ، رد الاتصال) ؛
محتوى الإخراج:
نسخة الكود كما يلي:
في 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 () {
count ++ ؛
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 ، هناك المزيد والمزيد من مكتبات الفصل التي تستجيب. الخطوة والمتزامنة هي جيدة.
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 ، الدقة ، رد الاتصال) ؛
} ،
وظيفة (رد الاتصال) {
FUNC2 (REQ ، الدقة ، رد الاتصال) ؛
} ،
وظيفة (رد الاتصال) {
FUNC3 (REQ ، الدقة ، رد الاتصال) ؛
}
]
) ؛