Async: ¿Cómo puedo enviar funciones dinámicamente con diferentes argumentos a una matriz? Necesito procesar esas funciones usando Async.js (modo paralelo o carrera)

Creado en 8 abr. 2016  ·  4Comentarios  ·  Fuente: caolan/async

Actualmente estoy tratando de ejecutar en paralelo la misma función con diferentes argumentos usando Node.JS

Para esto, uso Async.js y estoy luchando tratando de empujar / apilar funciones a una matriz.
El problema es que las funciones se ejecutan con los mismos argumentos. Esto es lo que tengo:

var async = require("async");
var array = [];
var x = [1,2,3,4];

// This portion of code works perfect and the arguments are passed perfectly
// The results that i am getting are: [100, 200, 300, 400]
array.push(function(callback){ callback(null,calculate(x[0]))});
array.push(function(callback){ callback(null,calculate(x[1]))});
array.push(function(callback){ callback(null,calculate(x[2]))});
array.push(function(callback){ callback(null,calculate(x[3]))});

// This portion of code does not work and I dont know why ... 
// The results that i am getting are: [400, 400, 400, 400]
// Obviusly the function is receiving the same argument a=4 everytime is called
for (i=0;i<3;i++){
    array.push(function(callback){ callback(null,calculate(x[i]))});
}

async.parallel(array,function(err,result){
    if (err) {
        console.log(err);
        return;
    }
    console.log("Results are: " + result);
});


function calculate(a) {
  return a*100
}

¿Alguna idea?
Gracias

question

Comentario más útil

Un montón de cosas aquí, incluidas las peculiaridades básicas del alcance de las variables JS. La respuesta corta a su pregunta es que puede usar async.map , también se ejecuta en paralelo:

async.map([1, 2, 3, 4], function(x, callback){
  callback(null,calculate(x))
}, function(err,result){
    if (err) {
        console.log(err);
        return;
    }
    console.log("Results are: " + result);
});

Pero la respuesta real es que no necesita Async en absoluto:

var result = [1, 2, 3, 4].map(calculate)

Todos 4 comentarios

Un montón de cosas aquí, incluidas las peculiaridades básicas del alcance de las variables JS. La respuesta corta a su pregunta es que puede usar async.map , también se ejecuta en paralelo:

async.map([1, 2, 3, 4], function(x, callback){
  callback(null,calculate(x))
}, function(err,result){
    if (err) {
        console.log(err);
        return;
    }
    console.log("Results are: " + result);
});

Pero la respuesta real es que no necesita Async en absoluto:

var result = [1, 2, 3, 4].map(calculate)

Muchas gracias ...

Enviado desde mi iPhone

El 7 de abril de 2016, a las 7:42 p.m., Alex Early [email protected] escribió:

Un montón de cosas aquí, incluidas las peculiaridades básicas del alcance de las variables JS. La respuesta corta a su pregunta es que puede usar async.map, también se ejecuta en paralelo:

async.map ([1, 2, 3, 4], function (x, callback) {
devolución de llamada (nulo, calcular (x))
}, función (err, resultado) {
si (err) {
console.log (err);
regresar;
}
console.log ("Los resultados son:" + resultado);
});
Pero la respuesta real es que no necesita Async en absoluto:

var result = [1, 2, 3, 4] .map (calcular)
-
Estás recibiendo esto porque eres el autor del hilo.
Responda a este correo electrónico directamente o véalo en GitHub

Hola Caolan,
Muchas gracias por la ayuda, funcionó perfectamente, sin embargo me gustaría saber cómo puedo implementar el modo "carrera".
Ya lo intenté varias veces y recibo errores.
Solo quiero ejecutar todas mis funciones en paralelo y obtener el resultado de quien termine primero.
¿Alguna idea sobre cómo implementar Async.race?
Saludos,
Alfredo Borrero
Fecha: jue, 7 de abril de 2016 18:42:25 -0700
De: [email protected]
Para: [email protected]
CC: [email protected]
Asunto: Re: [caolan / async] ¿Cómo puedo enviar funciones dinámicamente con diferentes argumentos a una matriz? Necesito procesar esas funciones usando Async.js (modo paralelo o carrera) (# 1104)

Un montón de cosas aquí, incluidas las peculiaridades básicas del alcance de las variables JS. La respuesta corta a su pregunta es que puede usar async.map, también se ejecuta en paralelo:

async.map ([1, 2, 3, 4], function (x, callback) {
devolución de llamada (nulo, calcular (x))
}, función (err, resultado) {
si (err) {
console.log (err);
regresar;
}
console.log ("Los resultados son:" + resultado);
});

Pero la respuesta real es que no necesita Async en absoluto:

var result = [1, 2, 3, 4] .map (calcular)

-
Estás recibiendo esto porque eres el autor del hilo.
Responda a este correo electrónico directamente o véalo en GitHub

Hola Caolan,

Muchas gracias por la ayuda, funcionó perfectamente, sin embargo me gustaría saber cómo puedo implementar el modo "carrera". Ya lo intenté varias veces y recibo errores.
Solo quiero ejecutar todas mis funciones en paralelo y obtener el resultado de quien termine primero.
¿Alguna idea sobre cómo implementar Async.race?

Saludos,

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