【问题标题】:Return a Dependent Promise返回一个依赖的承诺
【发布时间】:2014-04-01 02:30:47
【问题描述】:

我希望这是我缺少的一件简单的事情,但我似乎无法按我的意愿返回数据。我的函数 login 需要一个用户名,并返回密码和身份验证 ID,以及来自数据库的用户 XY 坐标。

XY 坐标取决于登录查询返回的 ID,这些 ID 都以 Promise 的形式返回给 main 函数进行身份验证。但是,我无法将所有数据返回到一个精心编织的对象中。

function login(user) {
    var query = 'SELECT password,id FROM player WHERE name='+mysql.escape(user);
    return db.select(query).then(function(rows) {
        console.log(rows);
        return Promise.all([
            getX(rows[0].id),
            getY(rows[0].id)
        ]);
    });
}

此日志:

[ { password: 'nopasswordforu', //<-- not a real password
    id: 9 } ]
[ [ { x: 32 } ], [ { y: 36 } ] ]

密码是从控制台语句记录的,而不是返回的。唯一返回的是xy 坐标。如何以与函数返回相同的 Promise 返回查询结果?

【问题讨论】:

    标签: javascript node.js promise bluebird


    【解决方案1】:
    function login(user) {
        var query = 'SELECT password,id FROM player WHERE name='+mysql.escape(user);
        return db.select(query).then(function(rows) {
            // Promise.all is unnecessary if the caller calls .spread()
            return [getX(rows[0].id), getY(rows[0].id), rows[0]];
        });
    }
    
    login(...).spread(function(x, y, user){
        console.log(x, y, user.password, user.id);
    })
    

    【讨论】:

    • 很高兴收到您的来信——不过请注意db.select 是一个自定义函数,因此它已经是异步的 :)
    • 奇怪,它不会让我在 cmets 中标记你。我会试一试,非常感谢你!
    • @RUJordan 它不会让你标记已经收到通知的人(即答案的作者总是会收到关于该答案的 cmets 的通知)。
    • @AaronDufour ohhhhhhh 我不知道。
    • 现在等到我们在浏览器的 ES6 支持中获得 .spread :/ Promise.coroutine 中没有析构 :)
    【解决方案2】:

    你可以这样做:

        return Promise.all([
            getX(rows[0].id),
            getY(rows[0].id)
        ]).then(function(xCoord,yCoord) {
          return Promise.all([{
              password:rows[0].password,
              x:xCoord[0].x,
              y:yCoord[0].y
          }]);
        });
    

    后一段代码如下所示:

    login('username').then(function(data) {
    /* 
     exposed:
    
     data.password,
     data.x,
     data.y
    
    */
    });
    

    请注意,我在这里假设 getX 和 getY 是异步函数,这就是您在它们周围调用Promise.all() 的原因。

    【讨论】:

    • 您能解释一下吗?您的答案目前不完整。
    猜你喜欢
    • 2015-11-27
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2019-12-07
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多