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上的返回是异步的,因此代码不等待其返回,只使用未定义的
有人能解释为什么会这样吗
我已经将代码更改为更好的解决方案,但我想知道为什么会发生这种情况
Javascript将自动添加最后的分号。您也不需要“捕获”。
getFullUser
肯定认为这是一个承诺,否则。then()
将返回错误。您确定getFullUser
中的某些内容不是承诺吗?getFullUser确实在内部使用承诺,但在解析并返回所需数据后返回一个简单对象。为什么添加捕获会使代码不等待getFullUser函数?
return getFullUser(userId).then(function(userObject)