ما هو إصدار غير متزامن الذي تستخدمه؟
2.6.1
ما البيئة التي حدثت فيها المشكلة في (إصدار العقدة / إصدار المتصفح)
8.11.3
ما الذي فعلته؟
بافتراض أن fileObj قد تم توفيره من الخارج:
async.auto({
download: (downloadCB) => {
if (fileObj) {
fs.writeFile(__dirname + ‘fileNew.txt’, fileObj.content, 'base64', function (err) {
if (err){
return downloadCB(err);
}
return downloadCB(null , fileObj.generatedFileName); // works fine
});
} else {
let err = new Error('File not found');
return downloadCB(err);
}
},
collectData: ['download', async (results, collectCB) => {
console.log(typeof collectCB); // prints undefined
console.log(typeof results); // prints correct object
let res = await anHttpRequest();
if (res.response && res.response.statusCode == 200) {
return collectCB(null , 'fileCombined.txt'); // This is where the ISSUE happens
}
else if(res.response.statusCode >= 300) {
return collectCB(new Error('Request failed inside async-auto'));
}
}],
filterData: ['collectData', (results, filterCB) => {
doFilter(results.collectData, filterCB);
}],
})
ماذا تتوقع أن يحدث؟
بعد انتهاء collectData من التنفيذ ، يجب أن تبدأ filterData في تنفيذ المعلمة التي تم تمريرها داخل دالة collectCB
ماذا كانت النتيجة الفعلية؟
TypeError: collectCB ليس دالة.
يتم تنفيذ نفس الكود بشكل جيد مع الإصدار 2.0.1 ولكن بعد الترقية إلى 2.6.1 توقف عن العمل وهو أمر بالغ الأهمية بالنسبة لنا. سيكون موضع تقدير أيضا أي عمل حولها.
نتعامل مع وظائف async
بشكل مختلف - لا نمرر لهم رد اتصال. بدلاً من ذلك ، ببساطة return
a قيمة (أو throw
خطأ).
نعم ، لقد تعلمت الأمر نفسه من StackOverflow وبالتالي نشر مرجع لنفسه هنا ، في حالة تعثر شخص ما على هذا في المستقبل: استخدام سلسلة غير متزامنة داخل غير متزامن
ينطبق هذا أيضًا على async.parallel إذا كانت الوظائف غير متزامنة ، فأنت بحاجة إلى إرجاع القيمة وليس استدعاء رد الاتصال. يجب أن يضاف هذا إلى الوثائق والأمثلة.
async.parallel({
// NOTE: for async functions just return value or throw error
// don't use the callback
dates: async function(callback) {
var rr = await getDates(dbName, r.indi, idx);
return rr;
},
sdates: async function(callback) {
var rr = await getDates(dbName, r.spouse, idx);
return rr;
},
cdates: async function(callback) {
var rr = await getDates(dbName, r.cindi, idx);
return rr;
}
},
function(err, results) {
console.log(results);
});
أرغب في إعادة كتابة الكثير من الأمثلة في المستندات لاستخدام المزيد من عدم التزامن / انتظار ، لإبراز ما يمكنك فعله الآن.
أكثر من ميزات في هذه الحزمة ، نحن بحاجة إلى مستندات. سيكون من الرائع رؤية المزيد من الأمثلة في المستقبل
التعليق الأكثر فائدة
نتعامل مع وظائف
async
بشكل مختلف - لا نمرر لهم رد اتصال. بدلاً من ذلك ، ببساطةreturn
a قيمة (أوthrow
خطأ).