【发布时间】:2018-02-08 13:18:10
【问题描述】:
我在后端有一些切换的特征值,我需要将它们与前端的一些值进行比较。这样网站决定是否应该显示日历,菜单......(这不是这里的问题)。
从后端我得到了七个简单对象的数组:
[
{name: "menu1"; value: "password"}
{name: "menu2"; value: "password"}
...
{name: "menu7"; value: "password"}
]
在前端我有一个对象:
{
"menu1": true;
"menu1": true;
...
"menu6": true;
}
我正在使用 axios 来获取这些数据。我遇到的问题是:即使我在前端有 6 个值,整个网站也会崩溃,因为这个功能不存在。它按预期工作,但我想抛出正确的错误。代码如下:
loadAttributes(URL) {
return axios.get(URL)
.then(res => {
const {attributes} = res.data;
const toggles = {};
for (let i = 0; i < attributes.length; i++) {
if (Constants.featureToggleMDs[attributes[i].name] === undefined) {
throw (new Error(`There is a feature: ${attributes[i].name} in ACS that is not presented in constants.`));
}
const left = Constants.featureToggleMDs[attributes[i].name].toUpperCase();
const right = sha512(attributes[i].value).toUpperCase();
toggles[attributes[i].name] = (left === right);
}
return toggles;
}).catch(e => console.error(`[Feature Toggle] Attributes not supported: ${e}`));
}
我有条件检查前端对象中是否存在值,并且在调试时,我只为“menu7”输入了这部分代码。不幸的是,错误被抛出 7 次。这就是这里的问题。它是如何以及为什么被抛出和捕获 7 次的?这是 axios 的问题吗?我试着用下面的 sn-p 简化它,它工作正常。但不在我的项目中。有什么想法吗?
let attributes = [
{ name: 'menu1', value: 'one' },
{ name: 'menu2', value: 'two' },
{ name: 'menu3', value: 'one' },
{ name: 'menu4', value: 'two' },
{ name: 'menu5', value: 'one' }
];
defaultFeatureToggles = {
'menu1': false,
'menu2': false,
'menu3': false,
'menu4': false
};
for (let i = 0; i < attributes.length; i++) {
if(defaultFeatureToggles[attributes[i].name] === undefined) {
console.warn(`This ${attributes[i].name} don't exists.`);
}
}
【问题讨论】:
-
在线
if (Constants.featureToggleMDs[attributes[i].name] === undefined) {...左侧是否有可能返回null或其他一些空值?这将导致下一行抛出。您可以将条件更改为if (!Constants.featureToggleMDs[attributes[i].name])进行验证
标签: javascript loops object axios