<p>async.mapLimit no devuelve una promesa</p>

Creado en 27 ago. 2019  ·  14Comentarios  ·  Fuente: caolan/async

¿Qué versión de async estás usando?
3.1.0

¿En qué entorno ocurrió el problema (versión de nodo / versión del navegador)?
nodo 12.9.1, npm 6.10.2, navegador N / A

¿Qué hiciste?
El problema tiene un hilo en stackoverflow
https://stackoverflow.com/questions/57622495/async-maplimit-with-promise/57659221#57659221

Básicamente, tengo este código:

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

Qué esperabas que sucediera?
Ejecutar sin errores, 'numPromise' debe contener una Promise. la consola debe registrar '2,4,6,8,10' y ' éxito: 2 , 4,6,8,10'

¿Cuál fue el resultado real?
Lanza un error: TypeError: No se puede leer la propiedad 'luego' de indefinido

Nota: Cuando uso el módulo 'promise-async' en lugar de 'async', este código funciona bien. La documentación dice que async.mapLimit (y otros) devuelven una Promise cuando no se proporciona ninguna devolución de llamada, pero no estoy definido. Todavía no se pudo encontrar ninguna muestra que funcione (consulte también mi sugerencia sobre el problema de 'necesitar muestras').

bug

Comentario más útil

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)

Todos 14 comentarios

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)

Muchas gracias, ejemplo razonable. Desafortunadamente, me da "SyntaxError: await solo es válido en la función async" (para 'await async.mapLimit')
¿Algo más que deba considerar?

El mensaje de error lo dice todo, await solo es válido en una función asincrónica, hasta que se implemente la propuesta de espera de nivel superior

Yip, estaba buscando un ejemplo completamente funcional, ya que esta es realmente la parte con la que luché. Sin embargo, no importa, finalmente lo puso en funcionamiento:

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

Todavía no estoy realmente seguro de qué es diferente a los intentos anteriores, pero validaré y agregaré más conclusiones sobre esto.
En cualquier caso, mi punto es que esto no es completamente intuitivo, creo, ¡así que ejemplos como este pueden ayudar!
Y ... todavía no entiendo completamente por qué tenemos que envolver todos los async / awaits a su alrededor, cuando async.mapLimit debería devolver una Promesa simple por sí misma ...

Ups, olvidé una espera en mi código anterior, editado

Muy bien, ahora lo confirmo completamente :-) Entonces, ¿probablemente el problema principal fue que la función iteratee no era completamente asincrónica?
De todos modos, parece que esto funciona de maravilla y probablemente también sea un gran ejemplo. ¡¡Gracias por quedarte en esto conmigo !!

Consulte https://github.com/caolan/async/issues/1673 para

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)

Ya veo, estás completamente conmigo, es decir, tuviste los mismos problemas.
Supongo que mi punto principal es realmente el siguiente: la documentación solo dice "Devoluciones: una promesa si no se pasa ninguna devolución de llamada", entonces, cuando tengo la variante de devolución de llamada, y luego simplemente dejo eso, ¿cómo llegaría a pensar que necesito para agregar la palabra clave 'async' cuando funcionó sin eso en la versión de devolución de llamada. Además, al usar el módulo 'promise-async', funciona exactamente como esperaba.

Además, todavía no he entendido por qué funciona el ejemplo de 'Promise.all' anterior ... esto es realmente confuso para mí.

La función iteratee que es async o el uso de una devolución de llamada no debería afectar la devolución de una promesa si se omite la devolución de llamada final. Esto es un error.

Te apuesto que esto está relacionado con el n. ° 1685

Te apuesto que esto está relacionado con el n. ° 1685

Definitivamente también recuerdo haber tenido ese problema antes en alguna versión de mis ejemplos de código. Supuse que obviamente fue causado por una codificación incorrecta. Entonces, es interesante ver que también aparece en un sabor diferente.

Investigué esto más.

mapLimit funciona según lo previsto. Apuesto a que cualquier problema que la gente vea aquí se debe a las limitaciones de detección de funciones que devuelven promesas o compiladores (por ejemplo, babel, mecanografiado) que no conservan las funciones async .

Investigué esto más.

mapLimit funciona según lo previsto. Apuesto a que cualquier problema que la gente vea aquí se debe a las limitaciones de detección de funciones que devuelven promesas o compiladores (por ejemplo, babel, mecanografiado) que no conservan las funciones async .

¿Cuál es la mejor forma de manejar estos escenarios en los que async no se conserva en las compilaciones?

Envuelva la función async en asyncify . http://caolan.github.io/async/v3/global.html#AsyncFunction

¿Fue útil esta página
0 / 5 - 0 calificaciones