8

私はredisからいくつかの値を取得し、それらを組み合わせて最終的に送信しようとしています。しかし、私はそれらの約束を機能させることはできません。

これはgetredisのシンプルな関数です

client.get('user:1:id',function(err,data){
    // here I have data which contains user ID
});
client.get('user:1:username',function(err,data){
    // here I have data which contains username
});

ID今、私はそれらを入手しusernameて送りたいのですが、それをどのように機能させるのか分かりません。私はそれをコールバックで動作させることができますが、それは非常に厄介な結果なので、匿名関数をQ.fcall呼び出しの前後にラップしようとしまし.thenた。

client.get('user:1:id',Q.fcall(function(err,data){
    return data;
}).then(function(val) {
   // do something
}));

しかし、渡された引数が多すぎるとエラーが発生し、それが機能したとしても、それが役立つかどうかさえわかりません。

4

3 に答える 3

10
Q.all([Q.ninvoke(client, 'get', 'user:1:id'),
       Q.ninvoke(client, 'get', 'user:1:username')]).then(function (data) {
  var id = data[0];
  var username = data[1];
  // do something with them
});

https://github.com/kriskowal/q#adapting-nodeを参照してください

于 2012-11-15T01:13:46.527 に答える
0

node-rediswhenjsを使用する単純な RequireJS モジュールを使用して、持ち上げられた redis ラッパーを作成します。

define [
  'redis/lib/commands'
  'when'
  'when/node/function'
], (Commands, When, NodeFn) ->
  'use strict'

  lift = (redis) ->
    wrapped = {}
    Commands.map (cmd) ->
      wrapped[cmd] = (args...) ->
        def = When.defer()
        args.push NodeFn.createCallback def.resolver
        redis[cmd].apply redis, args
        def.promise
    wrapped

  {lift}

使い方は簡単です:

client = lift redis.createClient()
client.get("hello").then console.log, console.error
于 2013-10-03T14:31:17.480 に答える