Async: Как я могу динамически передавать функции с разными аргументами в массив? Мне нужно обработать эти функции с помощью Async.js (параллельный или гоночный режим)

Созданный на 8 апр. 2016  ·  4Комментарии  ·  Источник: caolan/async

В настоящее время я пытаюсь запустить параллельно одну и ту же функцию с разными аргументами, используя Node.JS

Для этого я использую Async.js, и я изо всех сил пытаюсь передать функции / стек в массив.
Проблема в том, что функции выполняются с одинаковыми аргументами. Вот что у меня есть:

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
}

Есть идеи?
Спасибо

question

Самый полезный комментарий

Здесь много всего, в том числе основные причуды области видимости переменных JS. Короткий ответ на ваш вопрос заключается в том, что вы можете использовать async.map , он тоже работает параллельно:

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

Но настоящий ответ заключается в том, что вам вообще не нужен Async:

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

Все 4 Комментарий

Здесь много всего, в том числе основные причуды области видимости переменных JS. Короткий ответ на ваш вопрос заключается в том, что вы можете использовать async.map , он тоже работает параллельно:

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

Но настоящий ответ заключается в том, что вам вообще не нужен Async:

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

Спасибо большое ...

отправлено из моего Айфона

7 апреля 2016 г. в 19:42 Alex Early [email protected] написал:

Здесь много всего, в том числе основные причуды области видимости переменных JS. Короткий ответ на ваш вопрос заключается в том, что вы можете использовать async.map, он тоже работает параллельно:

async.map ([1, 2, 3, 4], function (x, callback) {
обратный вызов (null, вычислить (x))
}, function (err, result) {
if (err) {
console.log (ошибка);
возвращение;
}
console.log ("Результаты:" + результат);
});
Но настоящий ответ заключается в том, что вам вообще не нужен Async:

var result = [1, 2, 3, 4] .map (вычислить)
-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую или просмотрите его на GitHub

Привет, Каолан,
Большое спасибо за помощь, все сработало отлично, однако я хотел бы знать, как я могу реализовать режим "гонки".
Я уже пробовал несколько раз и получаю ошибки.
Я просто хочу запустить все свои функции параллельно и получить результат того, кто закончит первым.
Есть идеи, как реализовать Async.race?
С уважением,
Альфредо Борреро
Дата: 7 апреля 2016 г., 18:42:25 -0700
От: [email protected]
Кому: [email protected]
Копия: [email protected]
Тема: Re: [caolan / async] Как я могу динамически помещать функции с разными аргументами в массив? Мне нужно обработать эти функции с помощью Async.js (параллельный или гоночный режим) (# 1104)

Здесь много всего, в том числе основные причуды области видимости переменных JS. Короткий ответ на ваш вопрос заключается в том, что вы можете использовать async.map, он тоже работает параллельно:

async.map ([1, 2, 3, 4], function (x, callback) {
обратный вызов (null, вычислить (x))
}, function (err, result) {
if (err) {
console.log (ошибка);
возвращение;
}
console.log ("Результаты:" + результат);
});

Но настоящий ответ заключается в том, что вам вообще не нужен Async:

var result = [1, 2, 3, 4] .map (вычислить)

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую или просмотрите его на GitHub

Привет, Каолан,

Большое спасибо за помощь, все сработало отлично, однако я хотел бы знать, как я могу реализовать режим "гонки". Я уже пробовал несколько раз и получаю ошибки.
Я просто хочу запустить все свои функции параллельно и получить результат того, кто закончит первым.
Есть идеи, как реализовать Async.race?

С уважением,

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

ghost picture ghost  ·  9Комментарии

Kikobeats picture Kikobeats  ·  28Комментарии

kazaff picture kazaff  ·  10Комментарии

aearly picture aearly  ·  10Комментарии

daviddias picture daviddias  ·  14Комментарии