无法用 Promise 设置超时

问题描述 投票:0回答:1

我尝试使用 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);
  })
});

javascript promise
1个回答
0
投票

问题是,无论您在

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”,这会导致它立即打印。

© www.soinside.com 2019 - 2024. All rights reserved.