2017-09-04 168 views
1

時,我已經挖成的Redis和使用Redis的,因爲它是唯一的數據存儲一個微小的web應用程序的工作分解到布爾數組(我知道這不是Redis的的預期目的,但我從受益學習的命令,只是整體上節點的Redis我使用Node_Redis工作Node_Redis HGET使用Promise.all

這是我想要完成的(所有的Redis)什麼:。 我嘗試使用他們的電子郵件檢索用戶

這裏的問題: 我有一個Promise.all調用帶所有電子郵件(密鑰)和映射每個去一個HGET命令。當Promise.all解析我期望它與用戶對象的數組來解決,但它最終解析爲布爾值的陣列(即[真,真實,真])。

這裏是我實際使用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不返回的承諾。這是異步函數,你傳遞一個回調來獲得結果。你應該promisify此功能,使用它在Promise.all

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

你可以做promisification手動(如例以上),或者可以使用BluebirdQ庫與他們promisifypromisifyAll方法。