2015-05-28 2 views
1

Я пытаюсь выполнить две серии асинхронных функций с node.JS. Но я не понимаю, чтобы это сделать.Выполняет функции async series

Теперь у меня есть:

функция 1:

function search(client_id, callback) { 
    clientRedis.keys('director:*', function (err, results) { 
     results.forEach(function (key) { 
      clientRedis.hgetall(key, function (err, obj) { 
       //SAVE RESULT 
       console.log('save'); 
      }); 
     }); 
    }); 
    callback(null, results); 
} 

функция 2:

function range(client_id, callback) { 
    //Sort my array 
    callback(null, results); 
} 

И я вызывать эту функцию здесь:

async.series([ 
    search(client_id), 
    range(client_id); 
], function (err, result) { 
    console.log(err); 
    console.log(result); 
}); 

Моей проблема: Вторая функция - выполнение bef сначала первое, потому что первое занимает больше времени. Мне нужен результат первой функции ранжировать мой массив с помощью функции 2.

+0

На стороне примечания, знаете ли вы, что использование 'redis.keys' не рекомендуется в производстве, поскольку оно сканирует * все * ключи? – Zlatko

+0

Итак, что я могу использовать? – Matthieu

+0

Вам не понравится ответ: все зависит. Что вы там делаете? Некоторые идентификаторы объектов? Данные? Ранжированные данные, наборы, сериализованные объекты? – Zlatko

ответ

0

Если вы не собираетесь использовать результаты первой функции внутри второй непосредственно (только через Redis) вы можете используйте что-то вроде этого:

async.series([ 
    search.bind(null, client_id), 
    range.bind(null, client_id) 
], function (err, results) { 
    console.log(err); 
    console.log(results[0]); // for search results 
    console.log(results[1]); // for range results 
}); 
+0

. Пожалуйста, что такое bind? – Matthieu

+0

Прочтите https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – zag2art

0

search(client_id) и range(client_id) будут выполнять немедленно, уже callback аргумента назначен undefined тогда async.series будет пытаться выполнить результаты этих функций в виде ряда, и, вероятно, fail, потому что это не функции, а undefined. Вернее, если бы функции не пытались сделать undefined(null, results).

Имейте в виду, что f является функцией, f(...) выполняет ее. Вам нужно передать сами функции async.series, а не результаты их выполнения.

async.series хочет, чтобы вы проходили массив или объект задач, каждая задача - function(callback) { ... }.

Таким образом, следующее должно помочь:

async.series([ 
    function(callback) { search(client_id, callback); }, 
    function(callback) { range(client_id, callback); } 
]...) 

Если вы пишете в Haskell, который поддерживает каррирование, ваш код был бы правильным; но в JavaScript f(x)(y) - это не то же самое, что и f(x, y).

Вы также не вызываете callback из функции успеха Redis, которая также испортит вам время.

0

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

Запускает массив задач из функций последовательно, каждый из которых передает результаты в следующем массиве. Однако, если какая-либо из задач передает ошибку в свой собственный обратный вызов, следующая функция не выполняется, и основной обратный вызов немедленно вызывается с ошибкой.

И у вас есть большие ошибки в коде. Если я понимаю ваш код, вы хотите перейти ко второй функции после изменения всех ваших результатов и вернуть это для второй функции правильно?В этом случае используйте async.each вместо result.forEach и вызвать функцию обратного вызова после каждого асинхронном:

function search(client_id, callback) { 
    clientRedis.keys('director:*', function (err, results) { 
     var savedElems = []; 
     async.each(results, function (key, done) { 
      clientRedis.hgetall(key, function (err, obj) { 
       if (err) { 
        return done(err); 
       } 
       savedElems.push(obj); 
       done(); 
      }); 
     }, function (err) { 
      if (err) { 
       return callback(err); 
      } 
      callback(null, savedElems); 
     }); 
    }); 
} 
Смежные вопросы