Async: Como posso enviar funções dinamicamente com argumentos diferentes para uma matriz? Preciso processar essas funções usando Async.js (modo paralelo ou corrida)

Criado em 8 abr. 2016  ·  4Comentários  ·  Fonte: caolan/async

Atualmente estou tentando executar em paralelo a mesma função com argumentos diferentes usando Node.JS

Para isso, eu uso Async.js e estou lutando para tentar empurrar / empilhar funções para uma matriz.
O problema é que as funções são executadas com os mesmos argumentos. Isso é o que eu tenho:

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
}

Qualquer ideia?
Obrigado

question

Comentários muito úteis

Muitas coisas aqui, incluindo peculiaridades básicas de escopo de variável JS. A resposta curta à sua pergunta é que você pode usar async.map , ele também funciona em 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);
});

Mas a verdadeira resposta é que você não precisa do Async:

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

Todos 4 comentários

Muitas coisas aqui, incluindo peculiaridades básicas de escopo de variável JS. A resposta curta à sua pergunta é que você pode usar async.map , ele também funciona em 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);
});

Mas a verdadeira resposta é que você não precisa do Async:

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

Muito obrigado ...

Enviado do meu iPhone

Em 7 de abril de 2016, às 19h42, Alex Early [email protected] escreveu:

Muitas coisas aqui, incluindo peculiaridades básicas de escopo de variável JS. A resposta curta à sua pergunta é que você pode usar async.map, ele também funciona em paralelo:

async.map ([1, 2, 3, 4], função (x, retorno de chamada) {
retorno de chamada (nulo, calcular (x))
}, função (err, resultado) {
if (err) {
console.log (errar);
Retorna;
}
console.log ("Os resultados são:" + resultado);
});
Mas a verdadeira resposta é que você não precisa do Async:

resultado var = [1, 2, 3, 4] .map (calcular)
-
Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub

Oi Caolan,
Muito obrigado pela ajuda, funcionou perfeitamente, porém gostaria de saber como posso implementar o modo "corrida".
Já tentei várias vezes e estou recebendo erros.
Eu só quero executar todas as minhas funções em paralelo e obter o resultado de quem terminar primeiro.
Alguma ideia de como implementar Async.race?
Cumprimentos,
Alfredo Borrero
Data: Qui, 7 de abril de 2016 18:42:25 -0700
De: notificaçõ[email protected]
Para: [email protected]
CC: [email protected]
Assunto: Re: [caolan / async] Como posso enviar funções dinamicamente com argumentos diferentes para uma matriz? Preciso processar essas funções usando Async.js (modo paralelo ou corrida) (# 1104)

Muitas coisas aqui, incluindo peculiaridades básicas de escopo de variável JS. A resposta curta à sua pergunta é que você pode usar async.map, ele também funciona em paralelo:

async.map ([1, 2, 3, 4], função (x, retorno de chamada) {
retorno de chamada (nulo, calcular (x))
}, função (err, resultado) {
if (err) {
console.log (errar);
Retorna;
}
console.log ("Os resultados são:" + resultado);
});

Mas a verdadeira resposta é que você não precisa do Async:

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

-
Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub

Oi Caolan,

Muito obrigado pela ajuda, funcionou perfeitamente, porém gostaria de saber como posso implementar o modo "corrida". Já tentei várias vezes e estou recebendo erros.
Eu só quero executar todas as minhas funções em paralelo e obter o resultado de quem terminar primeiro.
Alguma ideia de como implementar Async.race?

Cumprimentos,

Esta página foi útil?
0 / 5 - 0 avaliações