NodeJS 有没有一种方法可以编写异步代码/函数,而不涉及任何Web API?

hs1ihplo  于 2023-02-03  发布在  Node.js
关注(0)|答案(4)|浏览(145)

我知道这听起来很愚蠢,因为javascript是单线程的,但我忍不住会想到这样一个函数,它花费了大量的时间,而没有Web API的参与

console.log("start")

function apple() {
  let appleCount = 10;
  while (appleCount < 1000000) {
    appleCount = appleCount + 10;
    appleCount = appleCount * 0.0000052
  }
}

apple();
console.log("end")

那么有没有办法异步运行这个苹果函数...我试着在浏览器中运行这个代码,但是没有得到任何结果...帮帮我...。

dxpyg8gm

dxpyg8gm1#

要运行像apple()函数这样100%纯Javascript的东西,使其不会阻塞主线程,唯一的方法是在不同的线程(在nodejs中,使用WorkerThread)或不同的进程中运行它。
正如你所知,主线程在一个线程中运行你的JavaScript,所以任何纯JavaScript的东西在运行时都会占用这个线程。为了不占用这个线程并阻塞事件循环,你必须在一个不同的线程中运行它,或者是WorkerThread,或者是在另一个进程中运行它。
我们可以使用setTimeout(apple, 100)setImmediate(apple)甚至Promise.resolve().then(apple)这样的计时技巧来改变代码运行的时间(延迟它的启动时间),但是所有这些计时技巧所做的只是改变代码开始运行的时间。在所有这些情况下,当代码运行时,它仍然阻塞并占用主线程,并在其运行时阻塞事件循环。
仅供参考,nodej中有许多异步操作不一定是Web API。例如,有异步文件API和加密API是异步和非阻塞的。因此,您的问题应修改为不仅指Web API,还指任何异步API。

zsohkypk

zsohkypk2#

那么有没有办法异步运行这个apple函数呢?
如果你不想等到你的苹果功能完成,那么你可以使用异步功能

注意:异步/承诺不是真正的异步。

console.log("start")

async function apple() {
  let appleCount = 10;
  while (appleCount < 1000000) {
    appleCount = appleCount + 10;
    appleCount = appleCount * 0.0000052
  }
}

apple().then(() => console.log("Apple completed"));
console.log("end")

但是如果您想在另一个线程上运行它,那么您应该使用Workers

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API

46qrfjad

46qrfjad3#

你只需要履行承诺。

function double(num) {
  return Promise.resolve(num * 2);
}

function add5(num){
  return Promise.resolve(num + 5);
}

double(1)// 2
    .then(add5)// 7
    .then(double)// 14
    .then(console.log)
rks48beu

rks48beu4#

我认为不使用内置或平台API就不可能在JavaScript中创建异步,这就是他要问的问题:

function scheduleTask(callback) {
  setTimeout(callback, 0);
}

scheduleTask(() => {
  console.log("This is an asynchronous task");
});

console.log("This is the main JavaScript thread");

正如您所看到的,我仍然不得不使用setTimeout或其他API来模拟异步任务等。

相关问题