我读过 Produce a promise which depends on recursive promises chaining recursive promise with bluebird Recursive Promises? 但我仍然无法弄清楚我如何构建我的承诺有什么问题
所以我从数据库中获取对象。每个对象都有一个字段,但有时它有一个UUID的引用。例如,如果一个人有朋友和母亲,那就像
{
"id": e872530a-27fc-4263-ad39-9a21568c31ef,
"name": "dood",
"friendId": {
"id": "571746fc-686d-4170-a53e-7b7daca62fa0",
"name": "peter"
},
"motherId": {
"id": "99b65849-1f1c-4881-a1d0-c5ae432e83a2",
"name": "ma"
}
}
现在,我的想法是当我获取一个对象时,我想用扩展版本替换任何其他UUID。
{
"id": e872530a-27fc-4263-ad39-9a21568c31ef,
"name": "dood",
"friendId": {
"isFulfilled": False,
"isRejected": False
},
"motherId": {
"isFulfilled": False,
"isRejected": False
}
}
因此,我正在使用承诺和递归试试这个,但我无法弄清楚我的承诺中出了什么问题。我得到了这个结果
function getExpandedObj(uuid, recursiveLevel) {
return getObj(uuid) //This gets the object from the database
.then(function(obj) {
//I convert the obj to an array where each element is
//{property:value} so I can do a map over it
// some code to do that, I think it's irrelevant so I'll
// skip it
return objArr;
})
.map(function(obj) {
//prevent infinite recursion
if (recursiveLevel > 0) {
for (var property in obj) {
if (typeof(obj[property]) === "string" ) {
var uuid = obj[property].match(/(\w{8}(-\w{4}){3}-\w{12}?)/g);
if (uuid != null) {
uuid = uuid[0];
obj[property] = getExpandedObj(uuid, recursiveLevel-1)
.then(function(exObj) { return exObj;})
}
}
}
}
})
.then(function(obj) {return obj;})
}
我使用的是bluebird js,代码如下所示
{{1}}
答案 0 :(得分:0)
尝试更改
obj[property] = getExpandedObj(uuid, recursiveLevel-1)
.then(function(exObj) {
return exObj;
});
到
return getExpandedObj(uuid, recursiveLevel-1)
.then(function(exObj) {
obj[property] = exObj;
return obj;
});
因为您将值设置为promise对象而不是实际值。
答案 1 :(得分:0)
问题在于:a)你的映射函数没有SupervisorStrategy
,所以没有等待b)你根本不应该使用return
。
完美的解决方案是Bluebird的Promise.props
等待对象属性的承诺。
map