我尝试使用 Promise 来测试不同的使用 Promise 的方式,然后遇到了这些问题。
我以为结果会等待3000ms然后打印
hello world 1
然后继续等待2000ms打印hello world 2
。然而,打印hello world 1
后,立即出现hello world 2
。
有专家可以帮我解释一下为什么会发生这种情况吗?
const helloWorld = new Promise((resolve, reject) => {
setTimeout(() => {
let temp = true;
if (temp) {
resolve("hello world 1");
} else {
reject("error occured");
}
}, 3000)
});
const helloWord2 = new Promise((resolve, reject) => {
setTimeout(() => {
let temp = true;
if (temp) {
resolve("hello world 2");
} else {
reject("error occured");
}
}, 2000)
});
helloWorld.then((value) => {
console.log(value);
helloWord2.then((value) => {
console.log(value);
})
});
问题是,无论您在
Promise
中放置什么功能,都会立即触发,现在当它被引用时。 Promise 对象只是存储结果或“尚无值”状态的对象,而不是可以根据命令触发的 lambda。如果您更改超时函数以包含 console.log,您可以看到这些函数的真实运行时间。
const helloWorld = new Promise((resolve,reject) => {
setTimeout(() => {
let temp = true;
console.log("hello world 1");
if(temp){
resolve("hello world 1");
}else {
reject("error occured");
}
},3000)
});
const helloWord2 = new Promise((resolve,reject) => {
setTimeout(() => {
let temp = true;
console.log("hello world 2");
if(temp){
resolve("hello world 2");
}else{
reject("error occured");
}
},2000)
});
helloWorld.then((value) => {
console.log(value);
helloWord2.then((value) => {
console.log(value);
})
});
您将首先看到第二个打印出来,因为它的超时时间较短。然后是第一个。然后您将看到您的
then()
块被执行。在第一个 Hello World 超时结束之前,此块不会执行,此时第二个 Hello World 的 Promise 已经解析为值“hello world 2”,这会导致它立即打印。