2013-10-11 63 views
0

我有以下操作來創建與node_redis用戶:如何使用可延遲來執行一系列Redis操作?

 
server.post('/create_user', function(req, res, next) { 
    console.log(req.body); 
    var body = req.body; 
    client.hincrby('users', 'count', 1, function(err, id) { 
    client.hmset('user:'+id, 
    'username', body.username, 
    'password', body.password, 
    'email', body.email, function(err, write) { 
     client.hmget('user:'+id, 'username', 'email', function(err, read) { 
     res.send({id: id, username: read[0], email: read[1]}); 
     }); 
    }); 
    }); 
}) 

我想閱讀有關可延遲和Promisses這裏:http://blog.jcoglan.com/2011/03/11/promises-are-the-monad-of-asynchronous-programming/

如何驗證碼與Deferrables和Promisses改寫,使清潔例外處理和更好的過程維護?

的行動基本上是:

  1. 增加計數器拿到ID
  2. 的用戶設置Redis的哈希ID爲
  3. 返回從創建的Redis

回答

3

有了承諾,你可以這樣做:

var Promise = require("bluebird"); 
//assume client is a redisClient 
Promise.promisifyAll(client); 

server.post('/create_user', function(req, res, next) { 
    console.log(req.body); 
    var body = req.body; 
    client.hincrbyAsync('users', 'count', 1).then(function(id){ 
     return client.hmsetAsync(
      'user:' + id, 
      'username', body.username, 
      'password', body.password, 
      'email', body.email 
     ); 
    }).then(function(write){ 
     return client.hmgetAsync('user:'+id, 'username', 'email'); 
    }).then(function(read) { 
     res.send({id: id, username: read[0], email: read[1]}); 
    }).catch(function(err){ 
     res.writeHead(500); 
     res.end(); 
     console.log(err); 
    }); 
}); 

這不僅表現比瀑布更好,但如果你有一個同步異常,你的進程不會崩潰,反而甚至同步 例外變成承諾拒絕。雖然我很確定上面的代碼不會拋出任何這樣的例外:-)

1

用戶我已經成爲一個風扇的異步庫。它非常高效,並且具有清理可讀性的出色方法。

下面是您的示例看起來像使用異步瀑布函數重寫的示例。

對於瀑布基本設置是:

async.waterfal([函數數組],finalFunction);

注意:瀑布方法期望回調函數總是有第一個參數是一個錯誤。關於這一點的好處是,如果在任何一個步驟都返回一個錯誤,那麼它會直接返回帶有錯誤的完成函數。

var async = require('async'); 

server.post('/create_user', function(req, res, next) { 
    console.log(req.body); 
    var body = req.body, 
     userId; 

    async.waterfall([ 
    function(cb) { 
     // Incriment 
     client.hincrby('users', 'count', 1, cb); 
    }, 
    function(id, cb) { 
     // Higher Scope a userId variable for access later. 
     userId = id; 
     // Set 
     client.hmset('user:'+id, 
     'username', body.username, 
     'password', body.password, 
     'email', body.email, 
     cb); 
    }, 
    function(write, cb) { 
     // Get call. 
     client.hmget('user:'+userId, 'username', 'email', cb); 
    } 
    ], function(err,read){ 
     if (err) { 
     // If using express: 
     res.render('500', { error: err }); 
     // else 
     res.writeHead(500); 
     res.end(); 
     console.log(err); 
     return; 
     } 
     res.send({id: userId, username: read[0], email: read[1]}); 
    }) 
}) 
+0

謝謝!正是我正在尋找的! – poseid