2014-10-12 2 views
1

Знаете ли вы способ использования команды множественных транзакций клиента redis с обещаниями bluebird?Redis multi с обещаниями bluebird

Потому что следующий код никогда не заканчивается.

var $redis = require('redis'), 
     $p = require('bluebird'), 
     $r = $p.promisifyAll($redis.multi()); 

    $r.setAsync('key', 'test') 
    .then(function(reply, data) { 
     // ... 
    }); 

    $r.exec(function() { 
    $r.quit(); 
    process.exit(); 
    }); 

ответ

2

Единственное, что необходимо для команды, чтобы не повиснуть получает много с promisified связи прежде.

var $redis = require('redis'), 
    $p = require('bluebird'), 
    $r; 

// this is important for bluebird async operations! 
$r = $p.promisifyAll($redis.createClient.apply(this, arguments)); 

// multi also need to be promisifed with the promisified conn above 
$r = $p.promisifyAll($r.multi()); 

$r.setAsync('key', '0').then(function(data) { }); 
$r.incrAsync('key'); 

// all of the above commands pipelined above will be executed with this command 
$r.execAsync().then(function() { 
    $r.quit(); 

    // this will make the console app (or whatever app) quit 
    process.exit(); 
}); 
1

Есть ли способ запустить Exec после этих блоков заканчивается?

Хм, только цепь его:

$r.pfaddAsync('key', item) 
    .then(function(result) { 
    // marked 
    if (result === 0) { 
     $r.incrAsync('dup'); 
    } else { 
     $r.incrAsync('unq'); 
    } 
    $r.exec(); 
    }); 

или, может быть, даже

$r.pfaddAsync('key', item) 
    .then(function(result) { 
    // marked 
    if (result === 0) { 
     $r.incrAsync('dup'); 
    } else { 
     $r.incrAsync('unq'); 
    } 
    }) 
    .then($r.exec); 

Или, если вы хотите выполнить его после в incrAsync s закончили, то это будет

$r.pfaddAsync('key', item) 
    .then(function(result) { 
    return $r.incrAsync(result === 0 ? 'dup' : 'unq'); 
// ^^^^^^ 
    }) 
    .then($r.exec); 

.then($r.exec) не может работать, когда exec требуется называться как метод, использовать .then($r.exec.bind($r)) вместо

+0

спасибо. Есть ли более элегантные решения? Что делать, если кому-то также нужно добавить дополнительные команды после $ r.pfaddAsync и не связано с pfaddAsync, но в конце нужно вызывать $ r.exec? –

+0

Нет, 'то' уже довольно изящный. Если вы хотите вызвать несколько независимых асинхронных функций и хотите дождаться их всех (прежде чем переходить к '$ r.exec'), вы можете использовать [' Promise.all'] (https://github.com/ petkaantonov/bluebird/blob/master/API.md # все --- пообещано) – Bergi

+0

не работает. консольный процесс просто зависает ... –

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