有没有一种方法可以在不涉及 Web API 的情况下编写异步 code/function?
Is there a way to write asynchronous code/function without any involvement of Web APIs?
我知道这听起来很愚蠢,因为 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")
有没有办法 运行 这个 apple 函数异步运行...我在浏览器中尝试 运行ning 这段代码但没有得到任何结果...帮帮我..
so is there a way to run this apple function asynchronously?
如果你不想等到你的苹果函数完成,那么你可以使用Async Functions.
注意:Async/Promises不是真正的异步。
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
你只需要return承诺。
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)
运行 像您的 apple()
函数那样 100% 纯 Javascript 的东西的唯一方法是 运行它在不同的线程(在 nodejs 中,使用 WorkerThread)或在不同的进程中。
您似乎知道主线程 运行 是您的 Javascript 在单个线程中,因此任何简单的 JavaScript 都会在 [=29] 时占用该单个线程=]宁。为了让它不占用单个线程并阻塞事件循环,您必须 运行 它在不同的线程中, WorkerThread
或 运行 它在另一个进程中。
可以使用 setTimeout(apple, 100)
或 setImmediate(apple)
甚至 Promise.resolve().then(apple)
等计时技巧来更改代码 运行s 的时间(启动时延迟),但所有这些计时技巧会在代码开始 运行ning 时发生变化。在所有这些情况下,当它 运行s 时,它仍然阻塞并占用主线程并在其 运行ning 时阻塞事件循环。
仅供参考,nodejs中有很多异步操作不一定是web APIs。比如有asynchronous fileAPIs和cryptoAPIs是异步非阻塞的。因此,您的问题应该修改为不仅涉及网络 APIs,还涉及任何异步 API.
我知道这听起来很愚蠢,因为 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")
有没有办法 运行 这个 apple 函数异步运行...我在浏览器中尝试 运行ning 这段代码但没有得到任何结果...帮帮我..
so is there a way to run this apple function asynchronously?
如果你不想等到你的苹果函数完成,那么你可以使用Async Functions.
注意:Async/Promises不是真正的异步。
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
你只需要return承诺。
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)
运行 像您的 apple()
函数那样 100% 纯 Javascript 的东西的唯一方法是 运行它在不同的线程(在 nodejs 中,使用 WorkerThread)或在不同的进程中。
您似乎知道主线程 运行 是您的 Javascript 在单个线程中,因此任何简单的 JavaScript 都会在 [=29] 时占用该单个线程=]宁。为了让它不占用单个线程并阻塞事件循环,您必须 运行 它在不同的线程中, WorkerThread
或 运行 它在另一个进程中。
可以使用 setTimeout(apple, 100)
或 setImmediate(apple)
甚至 Promise.resolve().then(apple)
等计时技巧来更改代码 运行s 的时间(启动时延迟),但所有这些计时技巧会在代码开始 运行ning 时发生变化。在所有这些情况下,当它 运行s 时,它仍然阻塞并占用主线程并在其 运行ning 时阻塞事件循环。
仅供参考,nodejs中有很多异步操作不一定是web APIs。比如有asynchronous fileAPIs和cryptoAPIs是异步非阻塞的。因此,您的问题应该修改为不仅涉及网络 APIs,还涉及任何异步 API.