javascript - 更好地理解 Promise.prototype.then
问题描述
我有一个看起来像这样的代码
function hello(){
setTimeout(() => console.log("after 3sec"), 3000);
}
let x = Promise.resolve()
x.then(() => {
hello()
}).then(() => console.log("after 1st then"))
现在输出很奇怪,第二个中的console.log then 函数在第一个中的console.log 之前执行然后..如何使其同步,我的意思是我怎么能说第二个.then
应该只在第一个之后执行.then
解决方案
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
返回一个 Promise,然后返回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"))