Async: Die Verwendung von async / await innerhalb der async.auto-Kette führt zu TypeError: Rückruf ist keine Funktion

Erstellt am 24. Sept. 2018  ·  5Kommentare  ·  Quelle: caolan/async

Welche Version von Async verwendest du?
2.6.1

In welcher Umgebung trat das Problem auf (Knotenversion/Browserversion)
8.11.3

Was hast du gemacht?
Angenommen, fileObj wird von außen versorgt:

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

Was haben Sie erwartet?
Nachdem die Ausführung von collectData abgeschlossen ist, sollte filterData mit der Ausführung des Parameters beginnen, der in der Funktion collectCB übergeben wurde

Was war das tatsächliche Ergebnis?
TypeError: collectCB ist keine Funktion.

Der gleiche Code läuft gut mit Version 2.0.1, aber nach dem Upgrade auf 2.6.1 funktioniert er nicht mehr und ist für uns kritisch. Alle Workarounds werden ebenfalls geschätzt.

docs question

Hilfreichster Kommentar

Wir behandeln async Funktionen anders – wir übergeben ihnen keinen Rückruf. Stattdessen einfach return ein Wert (oder throw ein Fehler).

Alle 5 Kommentare

Wir behandeln async Funktionen anders – wir übergeben ihnen keinen Rückruf. Stattdessen einfach return ein Wert (oder throw ein Fehler).

Ja, von StackOverflow davon erfahren und hier einen Verweis darauf gepostet, falls jemand in Zukunft darüber stolpert: Using-async-await-inside-async-auto-chain

Dies gilt auch für async.parallel, wenn die Funktionen asynchron sind, müssen Sie den Wert zurückgeben und den Rückruf nicht aufrufen. Dies sollte der Dokumentation und den Beispielen hinzugefügt werden.

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

Ich möchte viele der Beispiele in den Dokumenten neu schreiben, um mehr Async/Await zu verwenden, um hervorzuheben, was Sie jetzt tun können.

Mehr als die Funktionen in diesem Paket benötigen wir Dokumente. Es wäre toll, in Zukunft weitere Beispiele zu sehen

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen