当承诺链编码错误时,代码工作

时间:2016-03-21 02:50:10

标签: javascript node.js bluebird

我在理解为什么会这样做时遇到一些问题:

var userId;
var token;
var result = {};
var merchantId;
userCtrl.loginUser(req.body.email, req.body.password).then(function(data) {
            if (data.length == 1) {
                userId = data[0].user_id;
                return merchantCtrl.isMerchant(userId);
            } else {
                res.json({
                    result: 2
                });
            }
        }).then(function(data) {
            //If its merchant
            if (data.length === 1) {
                merchantId = data[0].merchant_id;
                token = tokenUtil.createTokenMerchant(merchantId, userId);
                result.token = token;
                getFullUser(userId).then(function(userObject) {
                    result.user = userObject;
                    result.user.user_id = userId;
                    merchantCtrl.getMerchant(merchantId)
                        .then(function(data) {
                            result.merchant = data[0];
                            res.json(result);
                        });
                });
            } else {
                token = tokenUtil.createTokenUser(userId);
                result.token = token;
                return getFullUser(userId);
            }
        }).then(function(userObject) {
            result.user = userObject;
            result.user.user_id = userId;
            res.json(result);
        })

因此,您可以在此代码中看到它缺少最终捕获条件和分号。但是编译得很好,反应也很准确。

现在这里是有趣的部分:getFullUser是一个使用promises获取所有用户信息(duh!)的函数,并且在所有promises解析之后它返回一个包含该用户的Object。

请注意,getFullUser函数不会返回promise。

现在看到这个错误后,我添加了最终的catch和分号:

var userId;
        var token;
        var result = {};
        var merchantId;
        userCtrl.loginUser(req.body.email, req.body.password).then(function(data) {
            if (data.length == 1) {
                userId = data[0].user_id;
                return merchantCtrl.isMerchant(userId);
            } else {
                res.json({
                    result: 2
                });
            }
        }).then(function(data) {
            //If its merchant
            if (data.length === 1) {
                merchantId = data[0].merchant_id;
                token = tokenUtil.createTokenMerchant(merchantId, userId);
                result.token = token;
                getFullUser(userId).then(function(userObject) {
                    result.user = userObject;
                    result.user.user_id = userId;
                    merchantCtrl.getMerchant(merchantId)
                        .then(function(data) {
                            result.merchant = data[0];
                            res.json(result);
                        });
                });
            } else {
                token = tokenUtil.createTokenUser(userId);
                result.token = token;
                return getFullUser(userId);
            }
        }).then(function(userObject) {
            result.user = userObject;
            result.user.user_id = userId;
            res.json(result);
        }).catch(function(error) {
            console.log("error: " + error.message + "; code: " + error);
            res.status(500).json({
                message: "Error logging in."
            });
        });

运行此错误时出现此错误:

error: Cannot set property 'user_id' of undefined; code: TypeError: Cannot set property 'user_id' of undefined

这表示在将user_id分配给result.user时,用户未定义。 这意味着因为getFullUser上的返回是异步的,所以代码不会等待它的返回而只是使用undefined。

任何人都可以解释为什么会这样吗?

我已经将代码更改为更好的解决方案,但我想知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:0)

    链中的
  1. catch() - 不是必需的,但强烈推荐。没有捕获 - 你可以丢失错误

  2. 使用

    然后()块中
  3. getFullUser(userId).then(function(userObject)...

  4. 你致电承诺,但没有返回结果(没有等待结果),这就是为什么在下一步,你会收到未定义的'作为下一个

    中的参数

    设置

    return getFullUser(userId).then(function(userObject)