我最近重组了该链。但是,尽管return
链接之一中的.then
语句是有条件的,但是为什么这个链在任何情况下仍然有效?
function addList(name) {
let listObj = {};
listObj.name = name;
return nameExists(name) //returns a promise<boolean>
.then((result) => {
console.log("foo");
return result; //without this return statement the chain would break,
//which makes sense to me because it does not return a
//promise otherwise.
})
.then(bool => {
listObj.unique = !bool;
if (validListID(name)) { //this is a synchronous regex function
listObj.unique = false;
}
if (!listObj.unique)
return Counters.getNewShortListId(); // returns Promise
//Does not return promise when condition not met.
//However the next chain gets called in any case.
})
.then((id) => { //this gets called even when listObj.unique = true,
//also this works perfectly, why?
listObj.__id = id;
return new List(listObj).save();
});
}
我真的很困惑为什么这样做会如此。我以为没有返回任何承诺时,承诺链就会中断?
答案 0 :(得分:1)
如果您没有从.then
返回Promise,则下一个.then
将继续正常工作(因为未引发任何错误),但其回调参数始终为{ {1}}:
undefined
如果您确定Promise.resolve()
.then(() => {
// don't return anything
})
.then((param) => {
console.log(param);
});
在解析时始终解析为非getNewShortListId
的值,只需检查下一个undefined
的{{1 }}不是.then
。
id
另一种选择是让较高的undefined
创建Promise,而不是较低的.then((id) => {
if (id !== undefined) {
listObj.__id = id;
return new List(listObj).save();
}
});
:
.then
如果您不喜欢嵌套.then
的外观,则可以将嵌套if (!listObj.unique)
return Counters.getNewShortListId()
.then((id) => {
listObj.__id = id;
return new List(listObj).save();
})
回调转换为事先声明的命名函数(例如.then
)。 / p>
您还可以抛出错误(例如.then
)以完全脱离当前的const processId = (id) => ...
链,并且控制流将立即转到下一个if (listObj.unique) throw new Error()
,跳过中间的{{ 1}} s-但通常不应将错误用于控制流。