Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当承诺链编码错误时,代码就起作用了_Javascript_Node.js_Bluebird - Fatal编程技术网

Javascript 当承诺链编码错误时,代码就起作用了

Javascript 当承诺链编码错误时,代码就起作用了,javascript,node.js,bluebird,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; retu

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

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条件和分号。但这很好,反应也很准确

现在有一个有趣的部分:getFullUser是一个使用Promissions获取所有用户信息的函数(duh!),在所有Promissions解析之后,它返回一个包含该用户的对象

请注意,getFullUser函数不返回承诺

现在,在看到这个bug之后,我添加了最后一个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
这表示将用户id分配给result.user时,用户未定义。 这意味着,由于getFullUser上的返回是异步的,因此代码不等待其返回,只使用未定义的

有人能解释为什么会这样吗

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

  • catch()位于链条底部-不需要,但强烈建议使用。没有捕获-您可能会丢失错误

  • then()中使用

    getFullUser(用户ID)。然后(函数(用户对象)

  • 您调用promise,但并没有返回结果(并没有等待结果),这就是为什么在下一步中,您会在next块中收到“undefined”作为param的原因

    设置


    Javascript将自动添加最后的分号。您也不需要“捕获”。
    getFullUser
    肯定认为这是一个承诺,否则
    。then()
    将返回错误。您确定
    getFullUser
    中的某些内容不是承诺吗?getFullUser确实在内部使用承诺,但在解析并返回所需数据后返回一个简单对象。为什么添加捕获会使代码不等待getFullUser函数?
    return getFullUser(userId).then(function(userObject)