sql >> Databáze >  >> NoSQL >> Redis

Nodejs, nečeká na dokončení dotazu Redis, než bude pokračovat v provádění

Říkáte, že file2/3 jsou "stejný obsah", ale nejsou v jedné kritické oblasti. Podle dokumentace Bluebird pro promisifyAll (viz http://bluebirdjs.com/docs/api/promise.promisifyall.html), tato funkce vytvoří ...Async verze každé základní funkce v klientovi Redis. Voláte hmgetAsync ve vašem prvním případě, ale voláte pouze hmget ve vašich ostatních.

To je důležité, protože používáte asynchronní vzor, ​​ale s neasynchronní strukturou kódu. V souboru 2/3 nastavíte result1 uvnitř asynchronního zpětného volání, ale poté jej vraťte pod každé volání dříve, než by se volání mohlo vrátit.

Máte dvě možnosti:

1:Soubor2/3/etc můžete převést na plně tradiční vzor předáním zpětného volání kromě klienta redis:

module.exports = function(redisclient, callback){

Místo vracení result1 , pak byste zavolali zpětné volání s touto hodnotou:

if(redisValue == 'test value'){
    callback(null, "success");
} else {
    callback("failed", null);
}

2:Soubor2/3/..N můžete převést na Promise-based, v takovém případě nemusíte promisifyAll(require(...)) - můžete jednoduše require() jim. Takový vzor může vypadat takto:

module.exports = function(redisclient){
    return redisclient.hmgetAsync("testdata", "text1");
};

Toto je mnohem jednodušší a čistší možnost, a pokud s ní budete pokračovat, uvidíte, že byste pravděpodobně mohli dokonce odstranit require() a jednoduše provést hmgetAsync v souboru1 s příslušnými daty vrácenými Cassandrou. Ale je těžké to vědět, aniž byste viděli potřeby vaší konkrétní aplikace. V každém případě jsou vzory založené na Promise obecně mnohem kratší a čistší, ale ne vždy lepší – jejich použití JE s mírnou výkonností. Je na vás, jakým směrem se vydáte – obojí bude fungovat.




  1. Operátoři MongoDB $gt/$lt s cenami uloženými jako řetězce

  2. Python - Jak zkontrolovat, zda je dostupný server Redis

  3. Proč mangusta vždy přidává na konec názvu mé sbírky písmeno s

  4. nastavit klíč vypršení platnosti v konkrétní čas při použití mezipaměti Spring s Redis