Async: Menggunakan async / menunggu di dalam rantai async.auto mengarah ke TypeError: panggilan balik bukan fungsi

Dibuat pada 24 Sep 2018  ·  5Komentar  ·  Sumber: caolan/async

Versi async apa yang Anda gunakan?
2.6.1

Di lingkungan mana masalah terjadi (Versi node/versi browser)
8.11.3

Apa yang kamu lakukan?
Dengan asumsi fileObj dipasok dari luar:

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);
  }],
})

Apa yang Anda harapkan terjadi?
Setelah eksekusi collectData selesai, filterData harus memulai eksekusi param yang dilewatkan di dalam fungsi collectCB

Apa hasil sebenarnya?
TypeError: collectCB bukan fungsi.

Kode yang sama dijalankan dengan baik dengan versi 2.0.1 tetapi setelah ditingkatkan ke 2.6.1 kode tersebut berhenti berfungsi dan ini penting bagi kami. Setiap pekerjaan di sekitar juga akan dihargai.

docs question

Komentar yang paling membantu

Kami memperlakukan fungsi async berbeda -- kami tidak memberikan mereka panggilan balik. Sebagai gantinya, cukup return sebuah nilai (atau throw sebuah kesalahan).

Semua 5 komentar

Kami memperlakukan fungsi async berbeda -- kami tidak memberikan mereka panggilan balik. Sebagai gantinya, cukup return sebuah nilai (atau throw sebuah kesalahan).

Ya, mempelajari hal yang sama dari StackOverflow dan memposting referensi yang sama di sini, jika seseorang menemukan ini di masa mendatang: Using-async-await-inside-async-auto-chain

Ini juga berlaku untuk async.parallel jika fungsinya async, Anda harus mengembalikan nilai bukan memanggil panggilan balik. Ini harus ditambahkan ke dokumentasi dan contoh.

        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);
        });

Saya ingin menulis ulang banyak contoh di dokumen untuk menggunakan lebih banyak async/menunggu, untuk menyoroti apa yang dapat Anda lakukan sekarang.

Lebih dari fitur dalam paket ini, kami membutuhkan dokumen. Akan sangat bagus untuk melihat lebih banyak contoh di masa depan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat