我开始使用承诺并尝试使用它们而不是回调来避免回调地狱。异步函数是从MongoDB的,Redis的,bcrypt模块等功能的组合,我能够远远地得到这样的:承诺基本知识。如何promisify异步节点代码?
var insert = Q.denodify(db.collection(USERS).insert);
var createCollection = Q.denodify(db.createCollection);
var sadd = Q.denodify(redisClient.sadd);
var sismember = Q.denodify(redisClient.sismember);
var genSalt = Q.denodify(bcrypt.genSalt);
var hash = Q.denodify(bcrypt.hash);
// SANITY CHECK
// a "name" parameter is required
if(!req.body.name || !isValidName(req.body.name))
return next(get400InvalidNameError());
// SANITY CHECK
// a "key" is optional
// if one is supplied, it must be valid
// this key will be hashed later
if(req.body.key){
if(!isValidKey(req.body.key))
return next(get400InvalidKeyError());
}
// STEPS:
// 1.
// check Redis cache to see if the "name" is already taken
// if yes, return error. if no, continue
// 2.
// construct a "user" object with name = req.body.name
// 3.
// req.body.key provided?
// if yes, generate salt and hash the key. Set user.key = hash
// if not, continue
// 4.
// create a collection in MongoDB with the same name as req.body.name
// 5.
// add req.body.name to cache
// 6.
// send a response to user using res.json()/res.end()
sismember(USERS,req.body.name)
.then(createUserObj,errHandler)
.then(genSalt(10),errHandler)
.then(hash(req.body.key,salt))
.then(createCollection(req.body.name),errHandler)
.then(sadd(USERS,req.body.name),errHandler)
.then(insert(user),errHandler)
.then(get200UserCreated,errHandler)
什么混淆我是所有这些功能都then()
-ed在一起的最后一部分。我有几个问题:
1.如何使一个异步函数的结果可用于另一个?
2.如何有条件地决定执行哪些功能?例如,我只想在提供req.body.key
时生成salt和hash。
3.我的then()
序列是否正确?
'1.'这是如何工作的承诺解决的承诺的结果成为下一个的参数 – Anonymous0day
问题1和2的答案可以很容易地找到StackOverflow,如果你花一点时间看看。至于3,不,因为你在定义'then'参数时立即调用函数,而不是定义稍后调用的函数。 – Touffy