确保复合承诺中的异步'.then()'执行

时间:2016-05-31 21:53:52

标签: javascript typescript promise

我正在使用Typescript来编写JS promises。我有一个复合的承诺,即承诺,它会返回一个承诺 我有:

test() {
    addElement("first")
        .then(
            function (val){
                addElement("second");
                console.log("second*);
            })
            .then(
            function (val){
                addElement("third");
                console.log("third*");
            });
}


export function addElement(elementText){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve();
        }, Math.random() * 2000);
    })
    .then(console.log(elementText));
}

我希望打印出这些函数first, second*, second, third*, third。但是,我得到了:

  

JS:首先   JS:第二个*   JS:第三名*   JS:第三名   JS:第二次

如何在被叫承诺'then完成后让then执行?

1 个答案:

答案 0 :(得分:0)

您不是then区块中返回您的承诺。如果您没有返回承诺,那么then块将立即return undefined,并且没有任何东西会等待它。如果您返回一个承诺,那么承诺链的执行将暂停,直到您返回的承诺得到满足为止。

test() {
    addElement("first")
        .then(
            function (val){
                console.log("second*");
                return addElement("second");
            })
            .then(
            function (val){
                console.log("third*");
                return addElement("third");
            });
}

虽然我个人认为这不是一个“菜鸟错误”,但你的描述与Nolan Lawson的“We have a problem with promises”中的“新秀错误#5”相符;继续阅读以获得更深入的解释。