Javascript嵌套Promise未按预期顺序运行

时间:2018-04-06 10:38:41

标签: javascript promise

我试图简化我的代码,实质上我有这个:



    function thirdPartyAPIMethod() { // Dummy method returning promise
       return Promise.resolve();
    }

    function func1() {
        console.log("func1 start");
        return thirdPartyAPIMethod().then(() => {
            console.log("func1 end");
            // ...
            resolve();
        });
    }
    
    function func2() {
        console.log("func2 start");
        // ...
        console.log("func2 end");
    }
    
    func1().then(func2());




我想运行func1并在完成后运行func2。所以我期待输出是这样的:

func1 start
func1 end
func2 start
func2 end

但相反它打印出来:

func1 start
func2 start
func2 end
func1 end

有人可以帮我这么做吗?

3 个答案:

答案 0 :(得分:2)

修改func1以在<{1}}承诺已解决后调用resolve

&#13;
&#13;
thirdPartyAPIMethod's
&#13;
&#13;
&#13;

答案 1 :(得分:1)

在对第一个承诺的then的调用中,您没有传递对func2的引用,而是调用它:

func1().then(func2()).catch(...);

将其更改为:

func1().then(func2).catch(...);

如果要传递参数:

func1().then(() => func2(...)).catch(...);

或者,使用pre-ES6语法:

funct1().then(function() { return func2(...); }).catch(...);

此外,当您定义承诺时,您没有调用resolvereject,理论上(除非您尚未发布所有代码)承诺永远不会完成:

function func1(...) {
    return new Promise((resolve, reject) => {
        console.log("func1 start");
        thirdPartyAPIMethod().then({
            console.log("func1 end");
            resolve(''); // resolve the promise with whichever value you want
        })
    });
}

答案 2 :(得分:0)

func1(...).then(func2(...)).catch(...);

在上面的代码中,func2()在作为输入传递之前正在执行。

正确的方法是

func1(...).then(func2).catch(...);

P.s以下代码等同于您想要实现的目标。

thirdPartyAPIMethod().then(func2).catch(...)