没有内置异步方法的异步 JavaScript [重复]

Asynchronous JavaScript without a built-in asynchronous method [duplicate]

提问人:kavron 提问时间:9/1/2023 更新时间:9/1/2023 访问量:56

问:

我看到的所有关于异步 JavaScript 的例子,当它们使用带有延迟的回调、promise 或 async/await 来伪造等待某些东西的例子时,请使用 setTimeout() 或 setInterval()。如果我没有收到回调、承诺或异步/等待一个 allready 内置异步代码怎么办?我想假装延迟,并且可以以同步方式使用 Date() 来完成。

这不仅仅是一个关于如何在不使用 setTimeout() 或 setInterval() 的情况下休眠/延迟的问题。这只是一个示例,希望在不调用内置异步方法的情况下查看异步 JavaScript 代码。

我的同步代码是:

const sleep = (milliseconds) => {
    let t0 = Date.now();
    const t1 = Date.now() + milliseconds;
    console.log(`Sleeping ${milliseconds} milliseconds`);
    while (t0 <= t1) {
        t0 = Date.now();
    }
};

const randomMilliseconds = () => {
    return Math.round(Math.random() * 10000);
};

const returnElement = () => {
        sleep(randomMilliseconds());
        console.log(element);
    };

const elements = [1, 2, 3, 4, 5];

function loopElements() {
    for (element of elements) {
        returnElement();
    }
}

loopElements();

我阅读了有关异步函数的信息,并认为我可以使用 loopElements() 或 returnElement() 来做到这一点,但无法做到。此外,我看到的所有关于异步循环的示例都使用 setTimeout() 或使用其他内置的异步解决方案,例如从 API 获取数据。

这能做到吗?仅以一个简单的 Date() 示例为例。

javascript async-await promise 回调 asynchronous-javascript

评论

1赞 Bergi 9/1/2023
如果不调用内置的异步方法,则代码不是异步的;句点。
0赞 Scott Marcus 9/1/2023
我认为你对“延迟”和“异步”感到困惑。延迟始终是同步的,例如,运行函数,然后等待 2 秒,然后执行其他操作。这是同步的。只是要获取/实现延迟,您需要使用异步 API。foo
0赞 Bergi 9/1/2023
@ScottMarcus “延迟总是同步的”——呃,不。您可以在代码中同步(阻塞睡眠,在达到计时器之前不执行任何操作)和异步(在计时器到期时安排事情)
0赞 Scott Marcus 9/1/2023
@Bergi 我说的是延迟的功能结果。代码中的延迟是在其他事情发生之前或之后发生的事情,而不是并行发生的。延迟的实现是通过异步 API 完成的。我认为 OP 混淆了两者。
0赞 Scott Marcus 9/1/2023
@Bergi 您可以在代码中同步构建延迟(阻塞睡眠,在达到计时器之前不执行任何操作)<-- 是的,但要构建这样的同步阻塞器,您需要异步代码(计时器)。延迟本身作为同步事件发生。

答:

0赞 2 revsQuentin #1

你不能。

使用异步功能时,将获得异步功能。

如果将自己限制为同步功能,则只能获得同步结果。

评论

0赞 kavron 9/1/2023
Callbacks、Promises、Async/Await 是异步功能。你的意思是没有内置的异步方法?您能否仅使用回调、承诺、async/await 而不是使用 setTimeout() 等内置方法,使用 Date() 使代码非阻塞/异步?
1赞 Quentin 9/1/2023
@kavron——我不知道你说的是什么意思,甚至不知道你用这句话指的是这个答案的哪一部分。
1赞 Bergi 9/1/2023
@kavron 并非所有回调都是异步的。回调只是异步代码使用的模式之一。
1赞 Bergi 9/1/2023
@kavron “你能用 Date() 使代码不阻塞/异步吗,只使用回调、承诺、异步/await,而不使用 setTimeout() 这样的内置方法?”——这篇文章的第一句话回答了这个问题。