<p>async.mapLimit gibt kein Versprechen zurück</p>

Erstellt am 27. Aug. 2019  ·  14Kommentare  ·  Quelle: caolan/async

Welche Version von Async verwendest du?
3.1.0

In welcher Umgebung trat das Problem auf (Knotenversion/Browserversion)
Knoten 12.9.1, npm 6.10.2, Browser N/A

Was haben Sie gemacht?
Problem hat einen Thread im Stackoverflow
https://stackoverflow.com/questions/57622495/async-maplimit-with-promise/57659221#57659221

Grundsätzlich habe ich diesen Code:

async = require('async');
let numPromise = async.mapLimit(['1','2','3','4','5'], 3, function(num, callback){
    setTimeout(function(){
        num = num * 2,
        console.log(num);
        callback(null, num);
    }, 
    2000);
})
numPromise
.then((result) => console.log("success:" + result))
.catch(() => console.log("no success"));

Was haben Sie erwartet?
Ohne Fehler ausführen, 'numPromise' sollte ein Promise enthalten. Konsole sollte '2,4,6,8,10' und ' Erfolg: 2,4,6,8,10' protokollieren

Was war das tatsächliche Ergebnis?
Es wirft einen Fehler: TypeError: Cannot read property 'then' of undefined

Hinweis: Wenn ich das Modul 'promise-async' anstelle von 'async' verwende, funktioniert dieser Code gut. Die Dokumentation sagt, dass async.mapLimit (und andere) ein Promise zurückgeben, wenn kein Rückruf bereitgestellt wird, aber ich erhalte undefiniert. Konnte noch kein funktionierendes Beispiel finden (siehe auch meinen Vorschlag zum Thema "Beispiele benötigen").

bug

Hilfreichster Kommentar

const async = require('async');
const delay = require('util').promisify(setTimeout);
const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2))
// or const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => {
//    await delay(200);
//    return num*2;
// })
numPromise.then(console.log)

Alle 14 Kommentare

const async = require('async');
const delay = require('util').promisify(setTimeout);
const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2))
// or const numPromise = async.mapLimit(['1','2','3','4','5'], 3, async num => {
//    await delay(200);
//    return num*2;
// })
numPromise.then(console.log)

Vielen Dank, vernünftiges Beispiel. Leider gibt mir "SyntaxError: wait is only valid in async function" (für 'await async.mapLimit')
Muss ich sonst noch etwas beachten?

Die Fehlermeldung sagt alles, wait ist nur in einer asynchronen Funktion gültig, bis der oberste Wartevorschlag implementiert ist

Yip, war auf der Suche nach einem vollständig funktionierenden Beispiel, da dies wirklich der Teil ist, mit dem ich zu kämpfen hatte. Aber egal, habe es endlich zum Laufen gebracht:

const myAsyncFunction = async function(){
    //const numPromise = await async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2))
    const numPromise = await async.mapLimit(['1','2','3','4','5'], 3, async num => {
        await delay(2000);
        console.log(num*2);
        return num*2;
     })
    //numPromise.then(console.log)
    return numPromise;
}
myAsyncFunction()
.then((result) => console.log(result));

Ich bin mir noch nicht wirklich sicher, was sich von früheren Versuchen unterscheidet, aber ich werde dies bestätigen und weitere Schlussfolgerungen hinzufügen.
Mein Punkt ist auf jeden Fall, dass dies alles nicht ganz intuitiv ist, glaube ich, also können Beispiele wie dieses helfen!
Und ... Ich verstehe immer noch nicht ganz, warum wir alle async/awaits darum wickeln müssen, wenn async.mapLimit nur ein einfaches Versprechen zurückgeben sollte ...

Ups, ich habe ein Await in meinem vorherigen Code vergessen, bearbeitet

Okay, jetzt bestätige ich es vollständig :-) Das Hauptproblem war also wahrscheinlich, dass die Iteratee-Funktion nicht vollständig asynchron war?
Wie auch immer, das funktioniert wie ein Zauber und ist wahrscheinlich auch ein großartiges Beispiel! Thx, dass du bei mir bleibst!!

Siehe https://github.com/caolan/async/issues/1673 für den Grund

async.mapLimit(['1','2','3','4','5'], 3, async num => delay(200).then(() => num*2)) // works

async.mapLimit(['1','2','3','4','5'], 3, num => delay(200).then(() => num*2)) // doesn't work

Promise.all(['1','2','3','4','5'].map(num => delay(200).then(() => num*2))) // works (plain promises)

Ich sehe, du bist ganz bei mir, dh hatte die gleichen Probleme.
Ich denke, mein Hauptpunkt ist wirklich der folgende - in der Dokumentation steht nur "Returns: a Promise if no callback is übergeben" - also, wenn ich die Callback-Variante habe und diese dann einfach weglasse, wie sollte ich dann denken, dass ich sie brauche? um das Schlüsselwort 'async' hinzuzufügen, wenn es in der Rückrufversion ohne funktionierte. Außerdem funktioniert es mit dem Modul 'promise-async' genau so, wie ich es erwartet habe.

Außerdem habe ich noch nicht verstanden, warum das obige 'Promise.all'-Beispiel funktioniert ... das ist wirklich verwirrend für mich.

Die Iteratee-Funktion async oder die Verwendung eines Callbacks sollte sich nicht auf die Rückgabe eines Promises auswirken, wenn der letzte Callback weggelassen wird. Dies ist ein Fehler.

Ich wette, das hängt mit #1685 zusammen

Ich wette, das hängt mit #1685 zusammen

Ich erinnere mich definitiv, dass ich dieses Problem auch schon in einigen Versionen meiner Codebeispiele hatte. Ich ging davon aus, dass es offensichtlich an einer falschen Codierung lag. Interessant zu sehen, dass es auch in einer anderen Geschmacksrichtung erscheint.

Ich habe mir das genauer angesehen.

mapLimit funktioniert wie vorgesehen. Ich würde wetten, dass alle Probleme, die die Leute hier sehen, auf die Einschränkungen beim Erkennen von Versprechen zurückgebenden Funktionen oder Compilern (z. B. Babel, Typescript) zurückzuführen sind, die async Funktionen nicht beibehalten.

Ich habe mir das genauer angesehen.

mapLimit funktioniert wie vorgesehen. Ich würde wetten, dass alle Probleme, die die Leute hier sehen, auf die Einschränkungen beim Erkennen von Versprechen zurückgebenden Funktionen oder Compilern (z. B. Babel, Typescript) zurückzuführen sind, die async Funktionen nicht beibehalten.

Was ist der beste Weg, um solche Szenarien zu handhaben, in denen async bei Kompilierungen nicht beibehalten wird?

Wickeln Sie die Funktion async in asyncify . http://caolan.github.io/async/v3/global.html#AsyncFunction

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen