我试图简化我的代码,实质上我有这个:
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
有人可以帮我这么做吗?
答案 0 :(得分:2)
修改func1
以在<{1}}承诺已解决后调用resolve
thirdPartyAPIMethod's
&#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(...);
此外,当您定义承诺时,您没有调用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
})
});
}
答案 2 :(得分:0)
func1(...).then(func2(...)).catch(...);
在上面的代码中,func2()在作为输入传递之前正在执行。
正确的方法是
func1(...).then(func2).catch(...);
P.s以下代码等同于您想要实现的目标。
thirdPartyAPIMethod().then(func2).catch(...)