Javascript嵌套承诺未按预期顺序运行

Javascript嵌套承诺未按预期顺序运行,javascript,promise,Javascript,Promise,我试图简化我的代码,本质上我有: 函数thirdPartyAPIMethod(){//Dummy方法返回承诺 返回承诺。解决(); } 函数func1(){ console.log(“func1启动”); 返回thirdPartyAPIMethod()。然后(()=>{ console.log(“func1 end”); // ... 解决(); }); } 函数func2(){ console.log(“func2启动”); // ... console.log(“func2 end”);

我试图简化我的代码,本质上我有:

函数thirdPartyAPIMethod(){//Dummy方法返回承诺
返回承诺。解决();
}
函数func1(){
console.log(“func1启动”);
返回thirdPartyAPIMethod()。然后(()=>{
console.log(“func1 end”);
// ...
解决();
});
}
函数func2(){
console.log(“func2启动”);
// ...
console.log(“func2 end”);
}

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

func1().then(func2()).catch(...);
将其更改为:

func1().then(func2).catch(...);
如果要传递参数:

func1().then(() => func2(...)).catch(...);
或者,使用ES6之前的语法:

funct1().then(function() { return func2(...); }).catch(...);
此外,当您定义承诺时,您没有调用
resolve
reject
,因此理论上(除非您没有发布所有代码),承诺永远不会完成:

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
        })
    });
}

修改
func1
以在
thirdPartyAPIMethod的
承诺得到解决后调用
resolve

函数thirdPartyAPIMethod()//返回承诺的伪方法
{
返回承诺。解决();
}
函数func1(){
返回新承诺((解决、拒绝)=>{
console.log(“func1启动”);
第三方方法()。然后(()=>{
console.log(“func1 end”);
resolve();//在此处调用resolve,以便func1()与func2链接
});
});
}
函数func2(){
console.log(“func2启动”);
console.log(“func2 end”);
}
func1()。然后(()=>func2());//然后使用函数回调处理程序代替func2的返回值
在上面的代码中,func2()在作为输入传递之前执行

正确的方法是

func1(...).then(func2).catch(...);
另外,下面的代码相当于您想要实现的代码

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

func1().then(func2).catch(…)顺便说一句,您从未调用过
resolve
@RolandStarke func2实际上有一些参数,如何传递它们?
func1()。然后((resolvedValue)=>func2(arg1,arg2,resolvedValue))。catch(…)请看这个问题:
thirdPartyAPIMethod().then(func2).catch(...)