即使return语句是有条件的,Promise链也会每次工作

时间:2019-08-10 11:15:12

标签: javascript asynchronous promise

我最近重组了该链。但是,尽管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();
    });
}

我真的很困惑为什么这样做会如此。我以为没有返回任何承诺时,承诺链就会中断?

1 个答案:

答案 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-但通常不应将错误用于控制流。