2017-09-04 9 views
1

私はredisを掘り下げ、データストレージとしてredisを使用する小さなWebアプリケーションで作業しています(私はそれがredisの意図された目的ではないことを知っていますが、 。。私はNode_Redisを使用しているコマンドを学習し、ちょうど全体のノード上のRedisでの作業Node_Redis Promise.allを使用するときにブール値配列に解決する

はここで私は(Redisの中のすべてを)達成したいものです。 私は彼らの電子メールを使用してユーザーを取得しようとしています

ここに問題があります: 私はPromise.all呼び出しを受け取りますすべての電子メール(キー)とマップをそれぞれHGETコマンドに渡します。 Promise.allが解決するとき、私はそれがユーザオブジェクトの配列で解決されると期待しますが、それはブール値の配列(つまり[true、true、true])に解決します。ここで

は、私が実際に倍のPromise.allの多くを使用しました /users

router.get("/", (req, res) => { 
    client.lrange("emails", 0, 1, (err, reply) => { 
    if (err) return console.log(err); 
    if (reply) { 
     Promise.all(
     reply.map(email => { 
      return client.hgetall(email, (err, reply) => { 
      if (err) return console.log(err); 
      console.log("reply for hgetall", reply); // this prints a user object correct, but Promise.all still resolves to boolean array :(
      return reply; 
      }); 
     }) 
    ) 
     .then(replies => { 
      // replies = [true, true, true ...] 
      res.send(replies); 
     }) 
     .catch(e => console.log(e)); 
    } else { 
     res.send([reply, "reply is null"]); 
    } 
    }); 
}); 

ためのロジックである、と私はRedisのからの応答を記録するとき、それはあまりにも正しいオブジェクトを示していたので、私はかなりよこの時点では混乱している。 Promise.allを取得して、ユーザーオブジェクトの配列に解決するにはどうすればよいですか?

答えて

2

問題は、client.hgetallが約束を返さないということです。これは非同期関数で、結果を得るためにコールバックを渡します。あなたはPromise.allでそれを使用するこの機能をpromisify必要があります。

... 
return new Promise((resolve, reject) => { 
    client.hgetall(email, (err, reply) => { 
    if (err) { 
     return reject(err); 
    } 
    resolve(reply); 
    }); 
}); 

あなたは(上記の例のように)手動promisificationを行うことができたり、promisifypromisifyAll方法でBluebirdまたはQライブラリを使用することができます。

関連する問題