Async: يؤدي استخدام async / await within async.auto chain إلى TypeError: رد الاتصال ليس دالة

تم إنشاؤها على ٢٤ سبتمبر ٢٠١٨  ·  5تعليقات  ·  مصدر: caolan/async

ما هو إصدار غير متزامن الذي تستخدمه؟
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 توقف عن العمل وهو أمر بالغ الأهمية بالنسبة لنا. سيكون موضع تقدير أيضا أي عمل حولها.

docs question

التعليق الأكثر فائدة

نتعامل مع وظائف async بشكل مختلف - لا نمرر لهم رد اتصال. بدلاً من ذلك ، ببساطة return a قيمة (أو throw خطأ).

ال 5 كومينتر

نتعامل مع وظائف 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);
        });

أرغب في إعادة كتابة الكثير من الأمثلة في المستندات لاستخدام المزيد من عدم التزامن / انتظار ، لإبراز ما يمكنك فعله الآن.

أكثر من ميزات في هذه الحزمة ، نحن بحاجة إلى مستندات. سيكون من الرائع رؤية المزيد من الأمثلة في المستقبل

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات