我想知道我是否正在使用此示例代码做任何可怕的事情:
something.on('register', function(user) {
client.setAsync(config.id, user.id) // From a package (I can't set the return value)
.then(function(){
return user; // is this OK?
})
.then(handleNewUser)
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
是否会有任何范围问题? (竞争条件,用户不是我认为的那样?)
我能以更优雅的方式传递用户吗?
答案 0 :(得分:1)
如果有的话,您的模式更好地保证与user
相同client.setAsync()
,而不是user
返回user
。如果程序包写得不好或记录错误,您可以完全收回其他一些对象。
但有一个附带条件 - 中间client.setAsync()
进程无法扩充您的user
对象。除非将client.setAsync()
本身作为参数传递给.then()
,否则没有机制可以这样做。只能假设在这种情况下这不是问题。
使用您拥有的内容,唯一明显的改进是使用少于something.on('register', function(user) {
client.setAsync(config.id, user.id) // From a package (I can't set the return value)
.then(function() {
return handleNewUser(user);
})
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
的链条形成您的链条,如下所示:
ask n-of a
您可能会喜欢阅读mysqli_more_results。特别是,找到标题为“嵌套(和)闭包”的答案,您将看到在闭包中访问先前的值是完全合理和恰当的。
答案 1 :(得分:0)
有点奇怪;
让promise库调用handleNewUser
函数本身是没有好处的,因为你必须添加额外的then
函数来返回user
才能使它工作。
我建议您在then
函数中自行调用该函数:
something.on('register', function(user) {
client.setAsync(config.id, user.id)
.then(function(){ return handleNewUser(user); }
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});
[注意:我尚未测试此版本] 或者,您可以使用部分应用的功能来使其更清洁:
something.on('register', function(user) {
client.setAsync(config.id, user.id)
.then(handleNewUser.bind(this, user); }
.then(getSomeStuff)
.catch(function(err) {
console.error("Promise chain error: ", err);
});
});