我的代码看起来像这样
function hello(){
setTimeout(() => console.log("after 3sec"), 3000);
}
let x = Promise.resolve()
x.then(() => {
hello()
}).then(() => console.log("after 1st then"))

现在输出很奇怪,第二个then的函数中的console.log在第一个控制台.log之前执行然后..如何使它同步,我的意思是我怎么能说第二个{{1}应该只在第一个.then
答案 0 :(得分:3)
setTimeout
本身不会返回Promise - 它是基于回调的。如果要在Promise链中使用基于回调的函数,则必须将其显式转换为Promise:
let x = Promise.resolve()
x.then(() => {
return new Promise(resolve => {
setTimeout(() => {
console.log("after 500ms");
resolve();
}, 500);
});
}).then(() => console.log("after 1st then"))
至于您的新问题,您必须让hello
返回一个承诺,然后返回hello
来电,以便进行链接:
function hello() {
return new Promise(resolve => {
setTimeout(() => {
console.log("after 500ms");
resolve();
}, 500);
});
}
let x = Promise.resolve()
x.then(() => {
return hello()
}).then(() => console.log("after 1st then"))