Зациклите обещание, возвращаемое redis на nodejs

Я пытаюсь использовать обещание в цикле for. Я чувствую, что пришло время впервые использовать Promise.all, но я не могу заставить его работать.

Вот что у меня так далеко:

redis.keys('en:230:*')
    .then(function(result) {
        // result = ['en:230.1', 'en:230.2', 'en:230.5', 'en:230.10', 'en:230.3', 'en:230.75']
        for (var k = 0; k < result.length; ++k) {
            redis.zcount(result[k])
                .then(function(r) {
                    console.log(r);
                })
        }
    })

Моя цель - подсчитать все отсортированные по "результату" наборы и поместить каждый результат в другой отсортированный набор с именем en:230:top. Он будет содержать результат подсчета для оценки и 1,2,5,10,3,75 для значения.

В настоящее время я только пытаюсь перебрать все "результат" и посчитать.

Кто-нибудь может мне помочь?

Редактировать:

Что я понял из Promise.all, так это следующее. Должно ли что-то подобное работать?

var array = [];
redis.keys('en:230:*')
    .then(function(result) {
        // result = ['en:230.1', 'en:230.2', 'en:230.5', 'en:230.10', 'en:230.3', 'en:230.75']
        for (var k = 0; k < result.length; ++k) {
            array.push(redis.zcount(result[k]));
        }
        return Promise.all(array);
    })
    .then(function(r) {
        console.log(r);
    })

1 ответ

Решение

Вы можете использовать Promise.all:

redis.keys('en:230:*')
    .then(function (results) {

        // collect individual promises in an array
        var queries = results.map(function (r) {
            return redis.zcount(r);
        });

        // return a promise that resolves when all of query promises resolve
        return Promise.all(queries);
    })
    .then(function (counts) {
        // do something with counts
    })
    .catch(function(err){
        // oops
    });
Другие вопросы по тегам