2014-01-22 2 views
11
асинхронной

мне нужно сделать код как следующее:node.js аргументов функции серии в

function taskFirst(k, v) { 
    console.log(k, v); 
} 

function taskSecond(k, v) { 
    console.log(k, v); 
} 

function run() { 
    var g1 = "Something"; 
    var g2 = "Something"; 
    var g3 = "Something"; 
    var g4 = "Something"; 

    async.series(
     [ 
      taskFirst(g1, g2), 
      taskSecond(g3, g4) 
     ], 
     function(error, result){ 

     } 
    ); 
} 

Что такое правильный способ передать пользовательские переменные и async.js функции обратного вызова?

ответ

18

Вы могли бы сделать что-то вроде этого:

function taskFirst(k, v, callback) { 
    console.log(k, v); 

    // Do some async operation 
    if (error) { 
     callback(error); 
    } else { 
     callback(null, result); 
    } 
} 

function taskSecond(k, v, callback) { 
    console.log(k, v); 

    // Do some async operation 
    if (error) { 
     callback(error); 
    } else { 
     callback(null, result); 
    } 
} 

function run() { 
    var g1 = "Something"; 
    var g2 = "Something"; 
    var g3 = "Something"; 
    var g4 = "Something"; 

     async.series(
      [ 
       // Here we need to call next so that async can execute the next function. 
       // if an error (first parameter is not null) is passed to next, it will directly go to the final callback 
       function (next) { 
        taskFirst(g1, g2, next); 
       }, 
       // runs this only if taskFirst finished without an error 
       function (next) { 
        taskSecond(g3, g4, next);  
       } 
      ], 
      function(error, result){ 

      } 
     ); 
} 
2

Это может быть следующим

function taskFirst(k, v) { 
    console.log(k, v); 
} 

function taskSecond(k, v) { 
    console.log(k, v); 
} 

async.series([ 
    function(callback) { 
     callback(null, taskFirst(g1, g2)); 
    }, 
    function(callback) { 
     callback(null, taskFirst(g3, g4)); 
    } 
],function(error, result){ 

}); 
+0

Это не сработает. Обратный вызов выполняется немедленно, поэтому async перейдет к следующей функции. Вы должны передать обратный вызов своей функции, и все это выполнит, если ваша асинхронная работа будет завершена. –

+0

Да - этот ответ предполагает, что код внутри taskFirst блокируется. – HexCoder

2

Это ответ на GitHub вопрос ASync в работал для меня идеально. https://github.com/caolan/async/issues/241#issuecomment-14013467

для вас это было бы что-то вроде:

var taskFirst = function (k, v) { 
    return function(callback){ 
     console.log(k, v); 
     callback(); 
    } 
}; 
+0

Спасибо, мне не хватало, что мне нужно было обернуть функцию и вернуть ее :) – nyarasha

+0

Мне нужно было создать динамический массив функций с параметрами, которые мне нужно было предоставить async.series, и ваш ответ помог мне в правильном направлении, спасибо –

1

лучше.

const a1 = (a, callback) => { 
    console.log(a, 'a1') 
    callback() 
} 
const a2 = (a, callback) => { 
    console.log(a, 'a2') 
    callback() 
} 

const run =() => { 
    async.series([ 
     a1.bind(null, 'asd'), 
     a2.bind(null, 'asd2') 
    ],() => { 
     console.log('finish') 
    }) 
} 
run() 
Смежные вопросы