我很难过。
这是代码:
const clientInfoPromise = buildPromiseMethod
clientInfoPromise.then((clients) => {
console.log('clients ' + JSON.stringify(clients))
console.log(clients.typeOf)
console.log(_.keys(clients))
这是输出:
clients {}
undefined
['undefined']
我希望_.keys(clients)返回一个空数组,而不是一个字符串'undefined'的数组。
_.isEmpty(clients) ? [] : _.keys(clients)
不起作用,因为_.isEmpty
会返回false
。
ClientInfoPromise在此处定义:
static buildPromiseMethod(cids) {
if (condition) {
// fetch data
const data = [data,data1,data2]
return Promise.resolve(_.zipObject(cids, data));
} else {
const clients = _(cids)
.indexBy()
.mapValues(() => {
return undefined; //contains empty data
})
.value();
return Promise.resolve(clients);
}
}
cids
可以是undefined
,[]
或[1,2,3]
(数字数组)。
答案 0 :(得分:3)
的console.log(clients.typeOf)
要记录clients
使用console.log(typeof clients)
的类型。
的console.log(_。键(客户端))
< [ '未定义']
_.key
报告clients
只有一个密钥,名为"undefined"
。最有可能的是,stringify
未显示此键值对,因为其值也未定义,这意味着它将被stringify
跳过。
要验证这一点,而不是
console.log('clients'+ JSON.stringify(clients))
使用
console.log('clients', clients)
这将显示所有属性,包括stringify
将跳过的属性,因为它们的值未定义。
在您的特定情况下,您报告的行为最好由buildPromiseMethod
中的错误解释,即它返回的承诺将被解析为具有单个键“undefined”且具有不可序列化值的对象。例如,请考虑以下事项:
> clients = { undefined: undefined };
> console.log('clients ' + JSON.stringify(clients))
< clients {}
> console.log(_.keys(clients))
< ['undefined']
这正是你得到的。
但是,buildPromiseMethod
如何返回这样一个格式错误的对象并不明显。最可能的罪魁祸首是zipObject
。这真的是您运行的确切源代码吗?例如,_.zipObject([cids], data)
(将cids
指定为数组,当其值未定义时,data
还包含未定义的值)可能会导致报告的行为:
var data, data1, data2; // values are undefined
data = [data, data1, data2];
var cids = undefined;
_.zipObject([cids], data);
> { undefined: undefined }
顺便说一下,你使用promises可能是错误的,至少假设// fetch data
是异步的。你可能想要
static buildPromiseMethod(cids) {
if (condition) {
return fetchdata().then(data =>
_.zipObject(cids, data));
}
或类似的东西。这可能与您的问题有关,如果data1
等从承诺中返回,并且您在承诺完成之前尝试访问它,在这种情况下它的值将是未定义的。