访问Promise链中的外部变量

时间:2015-12-14 12:50:34

标签: javascript node.js promise bluebird

我想知道我是否正在使用此示例代码做任何可怕的事情:

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);
    });
});

是否会有任何范围问题? (竞争条件,用户不是我认为的那样?)

我能以更优雅的方式传递用户吗?

2 个答案:

答案 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);
    });

});